NumPy广泛用于科学计算,提供了ndarray(n-dimension array, n维数组)对象以及作用于ndarray上的一系列操作。通常按如下方式导入NumPy:
import numpy as np
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将自动完成计算。
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
索引和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的一个副本。
NumPy中定义了一系列数学运算和数学函数操作,例如:
NumPy还有一些用于计算带有统计属性的函数,例如:
上述操作可以指定可选参数axis指定沿着哪个轴操作。这些操作也可以直接通过ndarray访问, 例如arr.sum().
比较操作符得到一个同等大小的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,