我是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)数组吗?
答案 0 :(得分:1)
这两行中的第一行是无用的。 python
不要求您初始化或“预定义”变量。第一个创建一个数组;第二个也创建一个,并重新分配变量。 new_array
的原始值将被丢弃。
new_array = np.ndarray(5, dtype=np.int32)
...
new_array = array[perm]
作为一般规则,np.ndarray
仅用于高级目的。 np.array
,np.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]])