Numpy:np_array [index_order_array]改变了数组中元素的顺序?

时间:2017-03-16 14:59:26

标签: python arrays numpy

我是Python和Numpy的新手

为什么array = [1,2,3,4]new_array = array[[3,2,0,1]]导致更改内部数组中提到的元素顺序?

import numpy as np

array = np.array([10,20,30,40,50])
array_link = np.array(['A','B','C','D','E'])

new_array = np.ndarray(5, dtype=np.int32)
new_array_link = np.ndarray(5, dtype=np.int32)

perm = np.random.permutation(array.shape[0])

new_array = array[perm]
new_array_link = array_link[perm]

print(new_array)
print(new_array_link)

# Output:
# [30 40 10 50 20]
# ['C' 'D' 'A' 'E' 'B']

以下是Playground

它是如何工作的?难道它不是用内部数组的元素(作为第一行)初始化一个新的(可能是2D)数组吗?

1 个答案:

答案 0 :(得分:1)

这两行中的第一行是无用的。 python不要求您初始化或“预定义”变量。第一个创建一个数组;第二个也创建一个,并重新分配变量。 new_array的原始值将被丢弃。

new_array = np.ndarray(5, dtype=np.int32)
...
new_array = array[perm]

作为一般规则,np.ndarray仅用于高级目的。 np.arraynp.zeros等用于创建新数组。

array是变量名称的不良选择。 array看起来太像np.array了,当我第一次复制上述内容时,实际上让我很困惑。

array = np.array([10,20,30,40,50])

总之,您的代码确实如此:

In [28]: arr = np.array([10,20,30,40,50])
In [29]: perm = np.random.permutation(arr.shape[0])
In [30]: perm
Out[30]: array([2, 0, 1, 4, 3])
In [31]: arr1 = arr[perm]
In [32]: arr1
Out[32]: array([30, 10, 20, 50, 40])

arr1是一个新数组,其值从arr中选择。 arr本身没有变化。

您可以通过以下方式为预定义数组指定值:

In [35]: arr2 = np.zeros(5, int)
In [36]: arr2
Out[36]: array([0, 0, 0, 0, 0])
In [37]: arr2[:] = arr[perm]
In [38]: arr2
Out[38]: array([30, 10, 20, 50, 40])

arr[perm]中,结果与perm形状相同,在本例中为5元素1d数组。如果我将perm转换为(5,1)列数组,结果也是一个(5,1)数组:

In [40]: arr[perm[:,None]]
Out[40]: 
array([[30],
       [10],
       [20],
       [50],
       [40]])
In [41]: _.shape
Out[41]: (5, 1)

数组索引的另一个例子 - 使用(2,2)数组:

In [43]: arr[np.array([[0,1],[2,3]])]
Out[43]: 
array([[10, 20],
       [30, 40]])