索引
基本索引
NumPy索引类似于Python列表的索引,但它提供了更多的功能。对于一维数组,你可以使用整数索引访问特定位置的元素:
import numpy as nparr = np.array([1, 2, 3, 4])
print(arr[2]) # 输出:3
对于多维数组,你可以使用逗号分隔的索引元组来访问元素:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr[1, 2]) # 输出:6
切片索引
切片是Python和NumPy中一种常用的数据访问方式,允许你访问数组的一部分:
arr = np.array([0, 1, 2, 3, 4, 5])# 获取索引1到4之前的元素
print(arr[1:4]) # 输出:[1 2 3]# 获取从开始到索引3(不包含)的元素
print(arr[:3]) # 输出:[0 1 2]# 获取索引2到末尾的元素
print(arr[2:]) # 输出:[2 3 4 5]
对于多维数组,你可以对每个维度分别进行切片:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 获取第一行
print(arr[0, :]) # 输出:[1 2 3]# 获取第一列
print(arr[:, 0]) # 输出:[1 4 7]# 获取子数组(2x2,从arr[1:, 1:]开始)
print(arr[1:, 1:]) # 输出:
# [[5 6]
# [8 9]]
布尔索引
布尔索引允许你根据布尔数组的值来索引目标数组,这在条件筛选数据时非常有用:
arr = np.array([0, 1, 2, 3, 4, 5])# 创建一个布尔数组
bool_arr = arr > 2# 使用布尔数组进行索引
print(arr[bool_arr]) # 输出:[3 4 5]# 直接使用布尔表达式
print(arr[arr > 2]) # 输出:[3 4 5]
花式索引
花式索引(Fancy indexing)允许你使用整数数组作为索引:
arr = np.array([0, 1, 2, 3, 4, 5])# 使用整数数组索引
print(arr[[1, 3, 4]]) # 输出:[1 3 4]
对于多维数组,花式索引可以让你访问数组的任意位置,甚至以非常灵活的方式重排数组:
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 获取(0,1)、(1,2)和(2,0)位置的元素
print(arr[[0, 1, 2], [1, 2, 0]]) # 输出:[2 6 7]
注意事项
- NumPy索引是从0开始的。
- 切片是原数组的视图,修改切片会影响原数组。如果需要复制,可以使用
.copy()
方法。 - 布尔索引和花式索引返回的数组不与原数组共享数据。
改变形状
numpy.reshape
是NumPy库中的一个非常重要的函数,它允许你重新排列给定数组的维度,而不改变数组中的数据。这意味着你可以将任何形状的数组转换成你需要的任何其他形状,只要新形状的总元素数与原始数组相同。
reshape
函数的基本语法如下:
numpy.reshape(a, newshape, order='C')
a
:要被重塑的数组。newshape
:整数或整数元组,指定了新数组的形状。如果newshape
是整数,则结果将是一维数组。特别地,newshape
可以为-1
,在这种情况下,值会自动计算以保持数组元素的总数不变。order
:{‘C’, ‘F’, ‘A’},可选。指定重塑操作和数组数据在内存中的读写顺序。'C’意味着C风格的顺序,'F’意味着Fortran风格的顺序,'A’意味着如果a
是Fortran连续的,在重塑过程中也应该保持Fortran连续。
示例1:基础重塑
将一维数组重塑为二维数组:
import numpy as nparr = np.arange(6)
print("Original array:", arr)# 重塑为2x3数组
reshaped_arr = arr.reshape((2, 3))
print("Reshaped array:\n", reshaped_arr)
示例2:自动计算维度
使用-1
自动计算维度,让NumPy自动确定正确的维度:
arr = np.arange(6)# 只指定行数,列数自动计算
reshaped_arr = arr.reshape((2, -1))
print("Reshaped array with -1:\n", reshaped_arr)
示例3:从多维到一维
将多维数组重塑为一维数组:
arr = np.array([[1, 2, 3], [4, 5, 6]