高性能计算和数据分析的基础包
import numpy as np
N维数组对象(ndarray): 同构数据多维容器。
每个数组都有一个shape(表示维度大小的元组)、dtype(说明数据类型的对象)。
创建ndarray
- array
- asarray
- arange
- ones、ones_like
- zeros、zeros_like
- empty、empty_like
- eye、identity
ndarray的数据类型dtype
可以通过ndarray的astype方法显式地转换其dtype.
注:调用astype无论如何都会创建出一个新的数组,拷贝。即使新dtype跟以前地一样!
数组切片
注:数组切片是原始数组地视图,意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上! 如果想要副本,arr[5:8].copy()。
注:通过布尔型索引选取数组中的数据,将总是创建数据的副本,同astype
跟列表不同的是,当你将标量值赋值给一个切片时,该值会自动传播到整个选区(广播),列表不可以。
In [1]: import numpy as np
In [2]: a = range(10)
In [3]: arr = np.arange(10)
In [4]: a
Out[4]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [5]: arr
Out[5]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [6]: arr[5:8]
Out[6]: array([5, 6, 7])
In [7]: a[5:8]
Out[7]: [5, 6, 7]
In [8]: arr[5:8] = 12
In [9]: arr
Out[9]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
In [10]: a[5:8] = 12
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-cf374f61a718> in <module>()
----> 1 a[5:8] = 12
TypeError: can only assign an iterable
切片是沿着一个轴向选取元素的,所以对于高维数组,可以一次传入多个切片,就像传入多个索引那样。
花式索引(Fancy indexing)
使用整数数组进行索引。
注:花式索引跟切片不一样,它总是将数据复制到新数组中。
In [1]: import numpy as np
In [2]: arr = np.arange(32).reshape((8,4))
In [3]: arr
Out[3]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
In [4]: arr[[4,3,0,6]]
Out[4]:
array([[16, 17, 18, 19],
[12, 13, 14, 15],
[ 0, 1, 2, 3],
[24, 25, 26, 27]])
In [5]: arr[[4,3,0,6],[0,3,1,2]]
Out[5]: array([16, 15, 1, 26])
In [6]: arr[[4,3,0,6]][:,[0,3,1,2]]
Out[6]:
array([[16, 19, 17, 18],
[12, 15, 13, 14],
[ 0, 3, 1, 2],
[24, 27, 25, 26]])
In [7]: arr[np.ix_([4,3,0,6],[0,3,1,2])]
Out[7]:
array([[16, 19, 17, 18],
[12, 15, 13, 14],
[ 0, 3, 1, 2],
[24, 27, 25, 26]])
数学和统计方法
| 方法 | 说明 |
|---|---|
| sum | 对数组中全部或轴向的元素求和(零长度为0) |
| mean | 算术平均数(零长度为NaN) |
| std | 标准差 |
| var | 方差 |
| min | 最小值 |
| max | 最大值 |
| argmin | 最小元素的索引 |
| argmax | 最大元素的索引 |
| cumsum | 所有元素的累计和 |
| cumprod | 所有元素的累计积 |
这类函数可以接受一个axis参数(用于计算该轴向上的统计值),最终结果是一个少一维的数组。 axis沿着某个轴:
轴0 :++‘列’++ 每行是一个向量
轴1 :++‘行’++ 每列是一个向量
看出规律了吗?不是是一会按列求和,一会按行求和,这么简单的!sum(axis=那个维) 那个维就消失,其他维不变,对消失的维求和
In [1]: import numpy as np
In [2]: a = np.array([[1,2], [3,4]])
In [3]: a
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: type(a)
Out[4]: numpy.ndarray
In [5]: a.shape
Out[5]: (2L, 2L)
In [6]: sum0 = np.sum(a, axis = 0)
In [7]: sum0
Out[7]: array([4, 6])
In [8]: sum1 = np.sum(a, axis = 1)
In [9]: sum1
Out[9]: array([3, 7])
排序
就地排序
ndarray.sort()
多维数组可以在任何一个轴上进行排序,只需将轴编号传给sort即可。
注: 顶级方法np.sort返回的是数组的已排序副本!而就地排序则会修改数组本身。
唯一化
np.unique(arr) 找出数组中的唯一值并返回已排序结果。
等同于
sorted(set(arr))
numpy中的集合函数
| 方法 | 说明 |
|---|---|
| unique(x) | 计算x中的唯一元素,并返回有序结果 |
| intersect1d(x,y) | 计算x和y中的公共元素,并返回有序结果 |
| union1d(x,y) | 计算x和y的并集,并返回有序结果 |
| in1d(x,y) | 得到一个表示“x的元素是否包含于y”的布尔型数组 |
| setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
| setxor1d(x,y) | 集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素。(异或) |
>>> values = np.array([6,0,0,3,2,5,6])
>>> np.in1d(values, [2,3,6])
array([True, False, False, True, True, False, True], dtype=bool)
线性代数
常用的numpy.linalg函数
| 函数 | 说明 |
|---|---|
| diag | 以一维数组的形式返回方阵的对角线元素 |
| dot | 矩阵乘法 |
| trace | 计算对角线元素的和 |
| det | 计算矩阵行列式 |
| eig | 计算方阵的本征值和本征向量 |
| inv | 计算方阵的逆 |
| pinv | 计算矩阵的Moore-Penrose伪逆 |
| qr | 计算QR分解 |
| svd | 计算奇异值分解(SVD) |
| solve | 解线性方程组Ax=b,其中A为一个方阵 |
| lstsq | 计算Ax=b的最小二乘解 |
随机数生成
比Python内置的random模块快。
部分 numpy.random 函数
| 函数 | 说明 |
|---|---|
| seed | 确定随机数生成器的种子 |
| permutation | 返回一个序列的随机排列 或 返回一个随机排列的范围 |
| shuffle | 对一个序列就地随机排列 |
| rand | 产生均匀分布的样本值 |
| randint | 从给定的上下限范围内随机选取整数 |
| randn | 产生正态分布(平均值为0, 标准差为1)的样本值 |
| binomial | 产生二项分布的样本值 |
| normal | 产生正态(高斯)分布的样本值 可指定均值和标准差 |
| beta | 产生Beta分布的样本值 |
| chisquare | 产生卡方分布的样本值 |
| gamma | 产生Gamma分布的样本值 |
| uniform | 产生在[0,1)中均匀分布的样本值 |
参考《Python for Data Analysis》

本文介绍NumPy库的基础知识,包括N维数组对象(ndarray)的创建、数据类型管理、数组切片、数学与统计方法、排序及线性代数运算等。此外还介绍了随机数生成方法及一些实用函数。
135

被折叠的 条评论
为什么被折叠?



