神奇索引

神奇索引

为了选出一个符合特定顺序的子集,可以简单的通过传递一个包含指明所需顺序的列表或数组来完成:

import numpy as np
arr = np.empty((8,4))

for i in range(8):
    arr[i] = i
print(arr)
print(arr[[4,3,0,6]])

打印结果:

[[0. 0. 0. 0.]
 [1. 1. 1. 1.]
 [2. 2. 2. 2.]
 [3. 3. 3. 3.]
 [4. 4. 4. 4.]
 [5. 5. 5. 5.]
 [6. 6. 6. 6.]
 [7. 7. 7. 7.]]

[[4. 4. 4. 4.]
 [3. 3. 3. 3.]
 [0. 0. 0. 0.]
 [6. 6. 6. 6.]]

也可以通过负的索引来。就不写上栗子了。

传递多个索引数组时,情况有些不同,这样会根据每个索引元组对应的元素选出一个一维数组

arr1 = np.arange(32).reshape((8,4))#重塑数组
print(arr1)
print('---------------|')
arr2 = arr1[[1,5,7,2], [0,3,1,2]]
print(arr2)

打印结果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
---------------|
[ 4 23 29 10]

在上面的栗子中,元素(1,0)、(5,3)、(7,1)、(2,2)被选中,如果不考虑数组的维数,神奇索引的结果总是一维的。

想象之中他的结果不应该是这样,而是通过矩阵中行列的子集形成的矩形区域,但是也可以通过下面的方式实现:

print(arr1[[1,5,7,2]])
print('---------------|')
print(arr1[[1,5,7,2]][:,[0,3,1,2]])

打印结果:

[[ 4  5  6  7]
 [20 21 22 23]
 [28 29 30 31]
 [ 8  9 10 11]]
---------------|
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]

这就是想象中的样子。

请牢记神奇索引与切片的不同,神奇索引总是将数据赋值到一个新的数组中,这就意味着你改变生成的新数组不会对原来的数组产生影响,而切片会,他的视图都是原来的数组

原文地址:https://www.cnblogs.com/chanyuli/p/11762410.html