使用切片索引到Numpy数组时,生成的数组视图始终是原始数组的子数组;而整数数组索引可以使用另一个数组中的数据构造任意数组。
import numpy as np
# 创建一个数组
a = np.array([[1,2], [3, 4], [5, 6]])
# 下面这行代码将返回一个形状为(3, )的数组[1 4 5]
print(a[[0, 1, 2], [0, 1, 0]])
"""当给定一个2D数组时,Numpy索引的工作原理如下:输入一个行索引列表,然后输入一个列索引列表。
从语义上讲,第一个索引检索语句是“from row 0 retrieve element 0,from row 1 retrieve element 1,
and from row 2 retrieve element 0”"""
# 上面的整数数组索引示例等同于此:
print(np.array([a[0, 0], a[1, 1], a[2, 0]]))
# 当使用整数数组索引时就可以使用原数组中的同一个元素
print(a[[0, 0], [1, 1]])
# 等效于前面的整数数组索引示例
print(np.array([a[0, 1], a[0, 1]]))
整数数组索引的一个非常好用的技巧是从矩阵中选择或改变元素:
import numpy as np
# 创建一个新数组,用于从中选择元素
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
print(a) # prints "array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])"
# 创建索引数组
b = np.array([0, 2, 0, 1])
# 使用b中的索引从a的每一行中选择一个元素
print(a[np.arange(4), b]) # Prints "[ 1 6 7 11]"
# 使用b中的索引来改变矩阵中的元素
a[np.arange(4), b] += 10
print(a) # prints "array([[11, 2, 3],
# [ 4, 5, 16],
# [17, 8, 9],
# [10, 21, 12]])