数组的索引
ps:在这里我将离散地选取单个或多个元素的操作归纳在索引的内容里面,而将连续的选取一系列元素放在切面的内容里
单个元素的索引
Numpy中的基本索引与python类似,对于一维或多维数组,可以直接基于0~n的下标进行索引。
import numpy as np
#一维数组的索引
arr = np.arange(10)
print(arr)
print('arr[0] = %d' % arr[0]) # 打印第0个元素
print('----------------------------')
#多维数组的索引
arr = np.arange(12).reshape(3,4)
print(arr)
print('arr[2][1] = %d' % arr[2][1]) # 打印第三行第二列的元素
输出结果为:
[0 1 2 3 4 5 6 7 8 9]
arr[0] = 0
----------------------------
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
arr[2][1] = 9
多个元素的索引
当我们需要一次索引多个数组元素的时候,我们就要传入多个索引。对于一维数组,我们可以传入一个一个数组,这个数组的内容就是要选取元素的下标。
import numpy as np
#一维数组的索引
arr = np.arange(10)
print(arr)
print(arr[[0,2,4,5]]) # 打印第0,2,4,5个元素
输出结果为:
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 5]
对于二维数组,我们可以传入两个数组。两个数组分别代表了要选取元素的行的下标和列的下标。可以想象,如果我们要选取四个元素,每个元素都有一个行下标和列下标,第一个元素的行下标存储在第一个数组的第0位置,而它的列下标存储在第二个数组的第0位置。同理,第二元素的行下标存储在第一个数组的第1位置,其列下标存储在第二个数组的第1位置。这就是Numpy的整数数组索引。注意:整数数组的索引中,两个数组的参数必须一致。
import numpy as np
#二维数组的索引
arr = np.arange(12).reshape(3,4)
print(arr)
# 打印第1行第1列 和 第1行第2列 第2行第3列 第3行第3列 的元素
# 注意python中的索引从0开始
print(arr[[0,0,1,2],[0,1,2,2]])
输出结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
-------------------------------------
[ 0 1 6 10]
数组的切片
对于一维数组的切片和python中对list的切片基本相同
import numpy as np
#一维数组的切片
arr = np.arange(10)
print(arr)
print('') # 空行
print(arr[2:]) # 截取第3个至末尾的元素
print(arr[1:5]) # 截取第2个至第4个元素(不包含第4个)
输出结果为:
[0 1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7 8 9]
[1 2 3 4]
对于二维数组,可以同时对行和列进行行切片。
import numpy as np
#二维数组的索引
arr = np.arange(12).reshape(3,4)
print(arr)
print('')
print(arr[0:2,0:3]) # 取二维数组前两行前三列
输出结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[0 1 2]
[4 5 6]]
使用 : 的切片操作只能选取连续的行列。如果我们要选取离散的列,可以采取以下方式,在列的索引处传入一个数组。假设我们选取前两行中的第4列和第1列,我们就传入[4,1],numpy会根据传入索引的顺序拼接出一个新的数组,效果如下。
import numpy as np
#二维数组的索引
arr = np.arange(12).reshape(3,4)
print(arr)
print('')
print(arr[0:2,[3,0]]) # 取前两行中的第1列和第4列
输出结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[3 0]
[7 4]]
这样我们就看到了我们将第4列的前两行元素和第一列的前两行元素放在了一个二维数组中。同理如果想要选取两个离散的行也可以在行的索引处传入一个包含索引的数组。
但是,这样做的必须有一个维度上必须是连续的索引,比如这个例子中行是一个连续索引(切片)。如果要同时选取离散的行和列,再用类似的方法就不行了。因为如果行和列都传入一个关于索引的数组那么就是整数数组索引了,它索引出来的是行和列相对应的单个元素。
因此我们需要通过np.ix_()函数进行索引。
import numpy as np
#二维数组的索引
arr = np.arange(12).reshape(3,4)
print(arr)
print('')
print(arr[np.ix_([0,2],[0,3])]) # 取前(第1行|第3行)中的(第1列|第4列)的所有元素
输出结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 3]
[ 8 11]]
布尔索引
如果我们将一个数组与一个值比较,就会返回一个与该数组维度相同的数组,其中每个元素都是bool型参数。其实就是将数组中每一个元素与该值进行比较返回的bool值构成了一个新的与该数组维度相同的数组。
import numpy as np
arr = np.arange(12).reshape(3,4)
print(arr)
print('')
b = arr > 5
print(b) # 取前(第1行|第3行)中的(第1列|第4列)的所有元素
输出结果为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[False False False False]
[False False True True]
[ True True True True]]
对于新得到的布尔型的数组,我们可以通过它来作为一个新的索引。通过这个索引我们可以将bool值为True的值给选取出来。
在这个例子当中,我们于是就可以将数组中所有大于5的数值都给取了出来。
print(arr[b])
输出结果为:
[ 6 7 8 9 10 11]
类似的,还能通过extract()函数来取出相对应位置为True的值。
print(np.extract(b,arr))
输出结果为:
[ 6 7 8 9 10 11]