NumPy_数据 Python的NumPy库

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,

参考:
  1. Python数据科学手册 
  2. NumPy Tutorial