NumPy广泛用于科学计算,提供了ndarray(n-dimension array, n维数组)对象以及作用于ndarray上的一系列操作。通常按如下方式导入NumPy:
import numpy as np
1. 创建ndarray
ndarray有多种创建方式。可以直接通过Python的列表创建。例如:
a1 = np.array([1, 2, 3, 4, 5]) # a1是一维数组
a2 = np.array([[1, 2, 3],
[4, 5, 6]]) # a2是二维数组
也可以通过NumPy的内置方法创建数组,例如:
np.zeros(10) # 大小为10的一维数组。所有元素都为0
np.ones((2,3)) # 大小为2x3的二维数组,所有元素都为1
np.full((3,4), 8.8) # 大小为3x4的二维数组, 所有元素都为8.8
np.arange(0, 10, 2) # 类似于Python的内置range函数, 在[0, 20)内以2为步长创建一维数组
reshape方法可以改变ndarray的形状。例如将一个包含9个元素的一维数组改变为3x3的二维数组:
arr2 = np.arange(0, 9)
""" 此时arr2为
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
"""
arr2 = arr2.reshape((3,3))
""" 此时arr2为
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
"""
原始ndarray的大小必须与变形后的ndarray大小一致,否则会报错。如果不知道ndarray的具体大小,可以向reshape方法的其中一个维度大小传入-1,NumPy将自动完成计算。
2. ndarray的属性
ndarray的元素具有相同的数据类型,常见的数据类型有:bool, int32, int64, uint32, uint64, float32, float64等. 创建ndarray的方法一般都提供可选参数dtype以指定元素的数据类型,默认为浮点数类型。可以通过ndrray的dtype属性得知其元素的数据类型。此外,ndarray还有如下常见属性:
# 创建一个2x3的二维数组arr, 元素的数据类型为32位整型
arr = np.array([[1, 2, 3],
[4, 5, 6]], dtype=np.int32)
arr.dtype # arr中元素的数据类型, 此处输出为dtype('int32')
arr.ndim # arr的维度, arr是二维数组,故输出为2
arr.shape # arr的形状, 此处输出为(2, 3)
arr.size # arr的大小, 此处输出为6
3. 索引与切片
索引和Python的列表类似,若要访问ndarray中某一元素,对于一维例如arr[0], 对于二维例如arr[0, 1], 对于三维例如arr[0, 1, 0], 以此类推,负数索引同样也可以使用。例如:
arr = np.array([[1, 2, 3],
[4, 5, 6]], dtype=np.int32)
arr[0, 1] # 第0行第1列, 值为2
arr[1, -1] # 访问第1行最后一个元素, 值为6
对于ndarray的切片操作,每个维度可通过start:stop:step访问,默认start=0, stop=所在维度的大小,step=1. 对于一维有arr[start:end:stop], 对于二维有arr[start:end:stop, start:end:stop], 以此类推。例如:
arr3 = np.arange(0, 12).reshape((3,4))
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
arr3[0:2, 1:3] # 取arr3的第0,1行, 第1,2列
"""
array([[1, 2],
[5, 6]])
"""
arr3[1, :] # 第1行, 可简写为arr3[1]. 输出为array([4, 5, 6, 7])
arr3[:, 1] # 第1列, 输出为array([1, 5, 9])
arr3[1, ::-1] # 取arr3的第一行,并逆序, 输出为array([7, 6, 5, 4])
arr3[::-1, ::-1] # 先对行逆序, 再对列逆序
"""
array([[11, 10, 9, 8],
[ 7, 6, 5, 4],
[ 3, 2, 1, 0]])
"""
需要注意的是,ndarray的切片操作返回的结果称为原ndarray数据的一个视图,而不是原数据的副本。也就是说,对切片元素的修改会导致原ndarray相应数据的修改。例如:
arr4 = np.arange(0, 10, 2) # arr4为array([0, 2, 4, 6, 8])
arr5 = arr4[:3] # arr5为array([0, 2, 4])
arr5[1] = 100
"""
执行上述操作后,
arr5 = array([ 0, 100, 4])
arr4 = array([ 0, 100, 4, 6, 8])
"""
返回视图而不是原数据的副本可以减少大型ndarray的复制操作所带来的巨大开销。如果确实需要复制ndarray, 通过调用arr.copy()得到arr的一个副本。
4. 数学函数
NumPy中定义了一系列数学运算和数学函数操作,例如:
- 重载操作符的运算:加、减、乘、除、幂、取模、取整、取绝对值等,这些操作也可以通过NumPy的内置函数使用,例如np.add, np.multiply, np.power.
- 三角函数与反三角函数。例如np.sin, np.cos, np.tan, np.arcsin, np.arccos, np.arctan.
- 指数与对数函数。例如np.exp, np.exp2, np.power(10, x), np.log, np.log2, np.log10.
5. 统计函数
NumPy还有一些用于计算带有统计属性的函数,例如:
- 求和、求积:np.sum, np.prod.
- 最大值、最小值、中位数:np.max, np.min, np.median.
- 最大值的索引、最小值的索引:np.argmax, np.argmin.(返回一个整数,相对起始元素的下标,而不是表示其位置的元组)
- 任一、所有:np.any, np.all.
- 均值、标准差、方差:np.mean, np.std, np.var.
- 百分位数:np.percentile. 例如,若np.percentile(arr, 75)的返回值为3, 则说明arr中75%的数据都不大于3.
上述操作可以指定可选参数axis指定沿着哪个轴操作。这些操作也可以直接通过ndarray访问, 例如arr.sum().
6. 比较
比较操作符得到一个同等大小的ndarray, 元素类型为bool. 例如:
arr = np.arange(10, 50, 2).reshape(4,5)
"""
array([[10, 12, 14, 16, 18],
[20, 22, 24, 26, 28],
[30, 32, 34, 36, 38],
[40, 42, 44, 46, 48]])
"""
arr < 36
"""
array([[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, False, False],
[False, False, False, False, False]])
"""
可利用上述统计函数对返回的布尔类型的ndarray操作。此外,还可以利用此ndarray选择特定元素。例如:
arr = np.arange(10, 50, 2).reshape(4,5)
arr[ arr % 4 == 0 ] # 选择
# array([12, 16, 20, 24, 28, 32, 36, 40, 44, 48]), 这里得到的是一维ndarray,