1. 一维数组的索引和切片
numpy的数组的索引和切片和python的列表操作一样,不同的一点是在numpy的数组中,提供了以列表形式传入多个元素位置,从而能够访问多个元素。
语法:arr[[index1, index2, index3, ...]]
代码示例:
import numpy as np
score = np.array([69, 80, 90, 40, 60, 20, 90, 94, 90, 99])
print(score[[0, 3, 4]])
输出结果:
[69 40 60]
2. 二维数组的索引和切片
二维数组操作可以像python中的列表操作一样,语法是这样的:
arr[row][col]
,row表示第几行,col表示第几列。
但是操作numpy的二维数组的语法还有一种,语法是这样的:
arr[row, col]
,row表示第几行,col表示第几列。
和numpy的一维数组同样的,二维数组也提供了以列表形式传入多个行、列索引访问多个元素。
方法:arr[[row1, row2], [col1, col2]]
,其中row和col是对应的,访问的是(row1,col1),(row2,col2)上的元素。
代码示例:
score = np.array([[69, 40, 30],
[80, 90, 40],
[90, 100, 50],
[40, 20, 99],
[60, 60, 66],
[20, 66, 44],
[90, 88, 56],
[94, 99, 67],
[90, 20, 70],
[99, 50, 86]])
print(score[0][1])
print(score[0, 1])
print(score[[0, 0], [1, 2]])
输出结果:
40
40
[40 30]
tip:对于二维数组的操作,我的理解就是在一维数组的基础上多加了一个列维度,这个列维度和行维度用","隔开即可,如果操作二维数组的时候只有一个维度,那么就是在操作行维度,而不用去关系列维度。
3. 三维数组的索引和切片
3.1 应用场景
三维数组的应用场景大多是图像处理领域,三个维度分别表示图像的宽、高以及三原色。
3.2 语法
和之前的一维、二维数组一样的,三维数组又多了一个维度,和之前一维变二维的变化一样。
访问单个元素:
arr[dim1, dim2, dim3]
访问多个离散的元素:
arr[[row1, row2, ...], [col1, col2, ...], [high1, high2, ...]]
访问连续的元素:
arr[row_start:row_end:step, col_start:col_end:step, high_start:high_end:step]
4. 索引的高级操作
4.1 布尔索引
布尔索引就是传入一个与数组形状相同的元素值为布尔类型的列表或数组,然后就能索引到列表中 True 的位置相同的元素。
语法:arr[bool_list]
,bool_list是类型为布尔的列表。
代码示例:
import numpy as np
data = np.array([[3800, 1, 15],
[4000, 8, 20],
[5000, 2, 30],
[4000, 20, 50]])
bool_list = [False, False, True, False]
print(data[bool_list])
输出结果:
[[5000 2 30]]
4.2 条件索引
条件索引本质是布尔索引。只不过这次我们传入的不再是元素的位置和布尔类型的列表,而是一个条件语句。通过传入一个条件语句来筛选出符合条件的数据。
语法:arr[条件语句]
或者numpy,where(条件语句)
,前一个直接返回值,后一个返回位置。
代码示例:
import numpy as np
score = np.array([69, 80, 90, 40, 60, 20, 90, 94, 90, 99]) # 学生的成绩
con = score > 60 # 筛查出分数大于60的分数
print('条件的布尔列表', con)
print('大于60的学生成绩', score[con]) # 查看大于60分的学生成绩
print('大于60的学生数组下标', np.where(score > 60))
输出结果:
条件的布尔列表 [ True True True False False False True True True True]
大于60的学生成绩 [69 80 90 90 94 90 99]
大于60的学生数组下标 (array([0, 1, 2, 6, 7, 8, 9]),)
在数据分析中,大多数都会用到条件索引来筛查数据。
5. 深拷贝还是浅拷贝?
数组的切片对象是浅拷贝,是源数组的视图。
Numpy 设计出来的目的便是处理大量的数据运算,如果直接产生副本的话会增大处理时间并导致存储问题。
所以修改切片对象的值,同时也会改变原对象的值。
这一点和python的列表不同,修改python列表的值,并不会改变原列表。
6. 总结
- numpy中的一维、二维、三维数组访问单个元素、离散的多个元素、连续的多个元素的操作
- numpy中的布尔索引和基于布尔索引的条件索引
- numpy中的索引和切片是深拷贝还是浅拷贝?和python的列表不同吗?
到这里,numpy中的索引和切片操作就讲解完了。下一节会讲解numpy中的数组运算。
我是张小yu,创作不易,请多关照。stay hungry,stay foolish。