NumPy 对数组的操作的介绍这里从
两个方面进行
一维数组的索引方法跟Python中的 list 的索引方法一致:
# 直接通过下标获取某个元素
arr = np.arange(10)
print(arr[5])
# 用范围作为下标获取数组的一个切片
print(arr[3:5]) # 包括 arr[3] 但不包括 arr[5]!
# 范围中的第三个参数表示步长
print(arr[1:-1:2]) # 2表示各一个元素取一个元素
多维数组每个维度都有一个索引,各个维度的索引之间用逗号隔开
# 创建一个二维数组
arr = np.array([
[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8],
[7, 8, 9, 10, 11]
])
# 获取第0行中第3列和第4列的元素
print(arr[0, 3:5])
# 获取第1和2行中第2~4列的元素
print(1:, 2:)
# 获取第2列中的元素
print(:, 2)
此外,还有使用 整数函数 和 布尔值 索引访问多维数组的方法:
# 创建一个二维数组
arr = np.array([
[1, 2, 3, 4, 5],
[4, 5, 6, 7, 8],
[7, 8, 9, 10, 11]
])
# 如若想一下获取,arr[0, 1], arr[1, 2], arr[2, 3]这三个元素组成的数组,便可通过下面这种方式
print(arr[
(0, 1, 2),
(1, 2, 3)
])
# 获取非连续列的元素也可通过序列完成
# 比如索引第1、2行中第0、2、3列的元素
print(arr[1:, (0, 2, 3)])
# 下面是通过布尔值索引访问多维数组的方式
mask = np.array([1, 0, 1], dtype = np.bool)
print(arr[mask, 2]) # 索引第0行,第2行中第2列的元素
通过 reshape
函数可以改变数组在每个维度上的大小。如果指定的维度和数组的元素的数量不相符,函数会抛出异常
arr = np.arange(12) # 创建一个一维数组
arr1 = arr.reshape(3, 4) # 将一维数组变成3行4列的二维数组
在 NumPy 中,ravel
函数和 flatten
函数都可以将多维数组展平,但是reval只能横向展平,flatten 可以选择展平的方向是纵向还是横向。
reval 函数示例:
arr = np.arange(12).reshape(3, 4) # 创建一个二维数组
print(arr)
print(arr.ravel()) # 将数组横向展平
flatten 函数示例:
arr = np.arange(12).reshape(3, 4) # 创建一个二维数组
print(arr.flatten()) # 默认为横向展平
print(arr.flattem('F')) # 加上参数F之后,改为纵向展平
对数组的组合分为横向组合和纵向组合,完成组合的函数有hstack
函数、vstack
函数以及concatenate
函数。
hstack 函数接收一个由ndarray对象组成的元组作为参数。
arr1 = np.arange(12).reshape(3, 4)
arr2 = arr1 * 3
# 两个数组进行横向组合
print(np.hstack((arr1, arr2)))
值得注意的是如果横向组合时两个数组的“行”不相等,函数会抛出异常。
vstack 函数和 hstack 函数用法一样,只是 vstack 函数实现数组的纵向组合
arr1 = np.arange(12).reshape(3, 4)
arr2 = arr1 * 3
# 实现两个数组的纵向组合
print(np.vstack((arr1, arr2)))
concatenate 函数通过参数 axis
来选择进行横向组合还是纵向组合,值为1表示横向组合,值为0表示纵向组合
# 实现横向组合
np.concatenate((arr1, arr2), axis = 1)
# 实现纵向组合
np.concatenate((arr1, arr2), axis = 0)
Numpy 提供了 hsplit
vsplit
dsplit
split
函数,实现将数组分割成相同大小的子数组,也可指定原数组中需要分割的位置
hsplit
函数实现数组横向分割
所谓横向分割,数组横向分裂成指定数目的子数组
arr = np.arange(16).reshape(4, 4)
print(np.hsplit(arr, 2)) # 指定分割为2个大小相同的子数组
vsplit
函数实现数组的纵向分割
其语法与 hsplit 函数一样,只是分割方向不同而已
split
函数可以通过axis参数实现对横向和纵向的选择,值为1为横向分割,值为0为纵向分割
arr = np.arange(16).reshape(4, 4)
# 横向分割为2个大小相同的子数组
print(np.split(arr, 2, axis = 1))
# 纵向分割为2个大小相同的子数组
print(np.split(arr, 2, axis = 0))