和Python里的列表类似,NumPy里的ndarray也支持索引和下标操作数据。
索引
- 可以直接使用下标来获取和修改数组里的数据。
na1 = np.array([8, 4, 9, 1, 7]) # 一维数组可以直接使用下标获取指定位置上的元素 na1[0] # 8 na1 # [8 4 9 1 7] na1[0] = 10 # 可以通过下标来修改元素 na1 # array([10, 4, 9, 1, 7]) na2 = np.random.randint(3, 10, size=(3, 5, 2)) # 多维数组有两种方式获取指定位置上的元素 print(na2[1][1][0]) print(na2[1,1,0]) na2[1,3,0] = 12 # 多维数组也可以通过下标来修改指定位置上的元素
a = np.random.randint(3,10,size=(5,3)) # 生成一个5行3列的数组 a # array([[8, 3, 9], # [6, 5, 4], # [3, 6, 3], # [6, 4, 3], # [7, 4, 4]]) # 利用下标取出第3行,第2列的数字6 a[2][1] # 6 a[2,1] # 这种写法也可以 b = np.array([[1,0],[2,2]]) a[b] # array([[[6, 5, 4], # [8, 3, 9]], # # [[3, 6, 3], # [3, 6, 3]]]) b = np.array([True, False, True, True, False]) # True取值,False不取值 a[b] # array([[8, 3, 9], # [3, 6, 3], # [6, 4, 3]]) x = a > 6 # 取出所有大于 6 的值 a[x] # array([8, 9, 7])
- 传入一个ndarray对象作为索引。
a = np.arange(3, 20) i = np.array([2, 9, 10, 13]) print(a) print(a[i]) j = np.array([[2, 5], [7, 10]]) print(a[j])
- 传入一个布尔类型元素的ndarray对象进行索引。True表示选择,False表示不选择
x = np.arange(5) y = np.array([True,False,True,True,False]) print(x[y])
切片
na = np.arange(10)
print(na[2:10])
print(na[6:-2])
print(na[5::2])
print(na[::-1])
b = np.random.randint(3,21,size=(5,4,6))
print(b[:,:2,3:0:-1])
a = np.array([[1,2,3],[3,4,5],[4,5,6],[5,6,7],[6,7,8]])
a[2:4]
# array([[4, 5, 6],
# [5, 6, 7]])
a[2:4,0:1]
# array([[4],
# [5]])
a[2:4,2:0:-1]
# array([[6, 5],
# [7, 6]])
遍历
和列表类似,ndarray对象也可以进行遍历。
nums = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 多维数组需要使用多层for循环进行遍历
for row in nums:
for cell in row:
print(cell) # 遍历数据,把一个个数据打印出来
for data in np.nditer(nums): # 还可以使用 numpy 里自带的 nditer 类直接对数据进行遍历
print(data)
for cell in np.nditer(a,order='F'): # order='C' 横向取数 order='F'纵向取数
print(cell)