Python Numpy:np\u数组[索引\u顺序\u数组]更改数组中元素的顺序?

Python Numpy:np\u数组[索引\u顺序\u数组]更改数组中元素的顺序?,python,arrays,numpy,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

我不熟悉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']
这是你的电话号码


这就是它的工作原理吗?它是否应该初始化一个新的可能是2D的数组,将内部数组的元素作为第一行?

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

new_array = np.ndarray(5, dtype=np.int32)
...
new_array = array[perm]
一般来说,np.ndarray仅用于高级目的。np.array、np.zero等用于创建新数组

数组是变量名的糟糕选择。数组看起来太像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]])

我不知道你指的是什么。我觉得一切都很正常。你在期待什么?你只是在创建一个新的数组,它是原始数组的排列。正如我在问题中已经提到的,我想知道为什么new_array=array[[3,2,0,1]]不会初始化一个新的,可能是2D数组,其中第一行是内部数组的元素?我想你把[]弄糊涂了,前者是用于索引的,后者用于构造新数组。请注意:避免使用np.ndarray类来构造数组是一种很好的做法。尽可能使用np.array、np.empty等。谢谢,在文档中找到更多信息