神奇索引
神奇索引
为了选出一个符合特定顺序的子集,可以简单的通过传递一个包含指明所需顺序的列表或数组来完成:
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]]
这就是想象中的样子。
请牢记神奇索引与切片的不同,神奇索引总是将数据赋值到一个新的数组中,这就意味着你改变生成的新数组不会对原来的数组产生影响,而切片会,他的视图都是原来的数组