Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 排序数组使用数组的不同排列参数为两个数组创建数组,以应用于其中一个数组,从而将其排序转换为另一个_Python_Arrays_Python 3.x_Numpy_Numpy Ndarray - Fatal编程技术网

Python 排序数组使用数组的不同排列参数为两个数组创建数组,以应用于其中一个数组,从而将其排序转换为另一个

Python 排序数组使用数组的不同排列参数为两个数组创建数组,以应用于其中一个数组,从而将其排序转换为另一个,python,arrays,python-3.x,numpy,numpy-ndarray,Python,Arrays,Python 3.x,Numpy,Numpy Ndarray,我需要根据“array2”(type=numpy.ma.core.MaskedArray)的每个数组(type=numpy.ma.core.MaskedArray)的参数顺序重新排列“array1”(type=numpy.ndarray)中的每个数组(type=numpy.ndarray)。两个较大数组中的索引相同的数组具有相同的参数,但排列方式不同。我以前尝试过使用array1[:,(0,2,1)],当时需要根据一种算法重新排列array1中的所有数组。但现在,需要根据从array2的相应数组

我需要根据“array2”(
type=numpy.ma.core.MaskedArray
)的每个数组(
type=numpy.ma.core.MaskedArray
)的参数顺序重新排列“array1”(
type=numpy.ndarray
)中的每个数组(
type=numpy.ndarray
)。两个较大数组中的索引相同的数组具有相同的参数,但排列方式不同。我以前尝试过使用
array1[:,(0,2,1)]
,当时需要根据一种算法重新排列array1中的所有数组。但现在,需要根据从array2的相应数组派生的单独排序算法重新排列array1中的每个数组

需要编写一些代码,例如
array1[:,(0,2,1)]
,但是使用一个数组[shape=array1.shape],该数组包含
(0,2,1)
形式的有序数组,替换上面示例中的
(0,2,1)
,以应用于array1的每个数组

注意:使用上述代码示例(首选一行)很重要,因为此代码将在另一个第三方数字软件中使用,并由其内置代码使用,其中array1的数据将在每个时间步中返回到第一个状态,其掩码可能在解决方案的每个时间步中更新。由每个时间步中的内置代码反复调用

对于测试:

import numpy as np
array1 = np.ma.masked_array([np.array([20, 30, 35]), np.array([5, 6, 10]), np.array([11, 4, 7])], mask=False, fill_value=999999)
array2 = np.array([np.array([35, 20, 30]), np.array([10, 6, 5]), np.array([11, 7, 4])])
在array1上应用时,必须根据array2订单实现修改数组,如下所示:

mod_array = [(1, 2, 0), (2, 1, 0), (0, 2, 1)]
结果必须通过一些代码实现,例如:

array1[:, mod_array]
其中mod_数组中的每个参数显示顺序,并将应用于每个数组1对应的数组。这将导致重新排列array1掩蔽数组的包含数组数据:

array1 = np.ma.masked_array([np.array([35, 20, 30]), np.array([10, 6, 5]), np.array([11, 7, 4])], mask=..., fill_value=999999)
您的2个阵列:

In [189]: array1
Out[189]: 
masked_array(
  data=[[20, 30, 35],
        [5, 6, 10],
        [11, 4, 7]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False, False]],
  fill_value=999999)
In [190]: array2
Out[190]: 
array([[35, 20, 30],
       [10,  6,  5],
       [11,  7,  4]])
您的排序索引:

In [191]: idx=np.argsort(array2,axis=1)
In [192]: idx
Out[192]: 
array([[1, 2, 0],
       [2, 1, 0],
       [2, 1, 0]])
将其应用于
array2
显示它对每一行进行排序:

In [193]: np.take_along_axis(array2, idx,1)
Out[193]: 
array([[20, 30, 35],
       [ 5,  6, 10],
       [ 4,  7, 11]])
应用于
阵列1

In [194]: np.take_along_axis(array1, idx,1)
Out[194]: 
masked_array(
  data=[[30, 35, 20],
        [10, 6, 5],
        [7, 4, 11]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False, False]],
  fill_value=999999)
In [195]: idx=np.argsort(array1,axis=1)
In [197]: idx=np.argsort(-array1,axis=1)
In [198]: np.take_along_axis(array1, idx,1)
Out[198]: 
masked_array(
  data=[[35, 30, 20],
        [10, 6, 5],
        [11, 7, 4]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False, False]],
  fill_value=999999)
要获得“所需”的重新排序,我必须反向排序
array1

In [194]: np.take_along_axis(array1, idx,1)
Out[194]: 
masked_array(
  data=[[30, 35, 20],
        [10, 6, 5],
        [7, 4, 11]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False, False]],
  fill_value=999999)
In [195]: idx=np.argsort(array1,axis=1)
In [197]: idx=np.argsort(-array1,axis=1)
In [198]: np.take_along_axis(array1, idx,1)
Out[198]: 
masked_array(
  data=[[35, 30, 20],
        [10, 6, 5],
        [11, 7, 4]],
  mask=[[False, False, False],
        [False, False, False],
        [False, False, False]],
  fill_value=999999)

这些数组的数据类型是什么,
object
int
?换句话说,您的
array2
是否与
array2=np.array([[35,20,30],[10,6,5],[11,7,4]])
相同?是的,问题在于排序,而不是排序。实际上,array1的数组必须重新排列为array2。最终数据必须是=[[35,20,30]、[10,6,5]、[11,7,4]],并且idx必须作为mod_数组。例如:mod_array[0]=[1,2,0],它将应用于array1[0],显示必须放置array1[0][0]而不是当前array1[0][1](mod_array[0][0]=1显示该参数必须位于的索引),mod_array[0][1](即“2”)和mod u array[0][2](即“0”)显示array1[0][1]和array1[0][2]必须分别放置而不是当前阵列1[0][2]和阵列1[0][0]。