ndarry, 一个具有矢量运算和复杂广播能力快速节省空间的多维数组
对整组数据进行快速运算的标准数学函数, 无需 for-loop
用于读写磁盘数据的工具以及用于操作内存映射文件的工具?
线性代数, 随机数生成以及傅里叶变换功能
用于集成 C/C++ 等代码的工具
一, ndarry: 一种多维数组对象
1, 创建 ndarry
- # 一维
- In [5]: data = [1,2,3]
- In [6]: import numpy as np
- In [7]: arr1 = np.array(data)
- In [8]: arr1
- Out[8]: array([1, 2, 3])
- # 二维
- In [11]: data2 = [[1,2,3],[4,5,6]]
- In [12]: arr2 = np.array(data2)
- In [13]: arr2
- Out[13]:
- array([[1, 2, 3],
- [4, 5, 6]])
- # 查看数组的信息
- In [15]: arr2.shape
- Out[15]: (2, 3)
- In [16]: arr2.dtype
- Out[16]: dtype('int32')
数组创建函数
array()
arange(), 类似 Python 内置函数 range(), 但是 range()返回的是列表
ones,zeros 创建一个全为 1/0 的数组, 但是传进去的参数要是一个集合, 例如 np.ones((2,3))
ones_like,zeros_like 创建一个跟传进去数组形状一样的全 1/0 数组
empty,empty_like 创建空的数组, 分配内存, 不存值
eye,identity 创建方阵
2. 数组和标量之间的运算
- In [36]: arr2
- Out[36]:
- array([[1, 2, 3],
- [4, 5, 6]])
- In [37]: arr3
- Out[37]:
- array([[11, 12, 13],
- [14, 15, 16]])
- # 加
- In [38]: arr2+arr3
- Out[38]:
- array([[12, 14, 16],
- [18, 20, 22]])
- # 乘
- In [39]: arr2*arr3
- Out[39]:
- array([[11, 24, 39],
- [56, 75, 96]])
- # 减
- In [40]: arr3-arr2
- Out[40]:
- array([[10, 10, 10],
- [10, 10, 10]])
- # 除
- In [41]: arr3/arr2
- Out[41]:
- array([[11. , 6. , 4.33333333],
- [ 3.5 , 3. , 2.66666667]])
- # 平方
- In [42]: arr2**2
- Out[42]:
- array([[ 1, 4, 9],
- [16, 25, 36]], dtype=int32)
3. 索引和切片
索引:
arr2d[0,0]或者是 arr2d[0][0]
arr3d[0,0,0]或者是 arr3d[0][0][0]
切片: 有: 标记
- arr2d[:2,:2]
- arr3d[:2,:2]
先区分数组和列表的操作
数组的切片是在原始数组上进行的, 而列表的切片操作则是进行了数据的赋值
如果需要切片的是一份副本而不是源数组本身, 需要 arr[5:8].copy()
- # 列表的切片
- >>> l1 = list(range(10))
- >>> l1
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- >>> l2 = l1[5:8]
- >>> l2
- [5, 6, 7]
- >>> l2[0]=15
- >>> l2
- [15, 6, 7]
- >>> l1
- [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- # 数组的切片
- In [50]: arr = np.arange(10)
- In [51]: arr
Out[51]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- In [52]: arr_slice = arr[5:8]
- In [53]: arr_slice
- Out[53]: array([5, 6, 7])
- In [54]: arr_slice[0]=15
- In [55]: arr_slice
- Out[55]: array([15, 6, 7])
- In [56]: arr
Out[56]: array([ 0, 1, 2, 3, 4, 15, 6, 7, 8, 9])
- # 二维数组的切片
- In [95]: arr2d
- Out[95]:
- array([[1, 2, 3],
- [4, 5, 6],
- [7, 8, 9]])
- In [96]: arr2d[:2]
- Out[96]:
- array([[1, 2, 3],
- [4, 5, 6]])
一次可以传入多个切片
- In [97]: arr2d[:2,:1]
- Out[97]:
- array([[1],
- [4]])
- In [98]: arr2d[:2,:2]
- Out[98]:
- array([[1, 2],
- #3 维
- In [83]: arr3d
- Out[83]: [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
- In [84]: arr3d[1]
- Out[84]: [[7, 8, 9], [10, 11, 12]]
- In [85]: arr3d[1][1]
- Out[85]: [10, 11, 12]
- In [86]: arr3d[1][1][1]
- Out[86]: 11
- In [87]: arr3d[1][1][2]
- Out[87]: 12
布尔型索引
- #[True,False,True]就相当有是取第 0/2 行
- In [121]: arr2d[[True,False,True]]
- Out[121]:
- array([[1, 2, 3],
- [7, 8, 9]])
- In [122]: arr2d[[True,False,True],2]
- Out[122]: array([3, 9])
花式索引
- # 与上边的博布尔型索引一样, 也是取第 0/2 行
- In [132]: arr2d[[0,2]]
- Out[132]:
- array([[1, 2, 3],
- [7, 8, 9]])
- # 花式索引注意以下问题
花式索引跟切片不同, 总是将数据复制到新数组中, 所以造成以下现象
- In [136]: arr2d[[0,2],[0,2]]
- Out[136]: array([1, 9])
- In [137]: arr2d[[0,2]][:,[0,2]]
- Out[137]:
- array([[1, 3],
- [7, 9]])
数组转置和轴对换
转置是重塑的一种特殊形式, 它返回的是源数据的视图, 不会进行复制操作.
- In [142]: arr2d.T
- Out[142]:
- array([[1, 4, 7],
- [2, 5, 8],
- [3, 6, 9]])
4. 对数组的元素进行操作的函数
对单个数组元素的操作函数
abs 计算绝对值
sqrt 计算各元素的平方根
square 计算各元素的平方
exp 计算各元素的以 e 为底的指数
log/log10/log2/log1p log1p 是 log(1+x)
sign 计算各元素的正负号
ceil 计算大于等于该元素的最小整数
floor 计算小于等于该元素的最大整数
rint 将该元素四舍五入到最接近的整数
modf 返回该元素的小数和整数部分, 以两个独立数组的形式
isnan is not a number 判断各元素是否是数字
isfinite isinf 判断各元素有穷无穷
- cos/sin/tan
- arccos/acccosh/arcsin
对两个数组元素操作的函数
add 将数组中元素相加
subtract 第一个数组中元素减去第二个数组中元素
multiply 数组对应元素相乘
divide floor_divide 除法, 丢弃余数的除法
power(a,b) 将 a 中元素计算 b 中对应元素 a 的 b 次方
mod 求除法的余数
copysign 将第二个数组中的元素符号赋值给第一个数组中的值
<>= <= == != 比较对应元素的值
logical_and/logical_or/logical_xor
5. 一些可以用数组来处理的运算
矢量化方便运算
三元运算
- In [6]: xarr = np.array([1.1,1.2,1.3,1.4,1.5])
- In [7]: yarr = np.array([2.1,2.2,2.3,2.4,2.5])
- In [8]: cond = np.array([True,False,True,True,False])
- In [9]: result = [x if c else y for x ,c ,y in zip(xarr,yarr,cond)]
- In [10]: result
- Out[10]: [1.1, 1.2, 1.3, 1.4, 1.5]
- # np.where 通常用于根据一个数组生成另外一个数组
- In [11]: result2 = np.where(cond,xarr,yarr)
- In [12]: result2
- Out[12]: array([1.1, 2.2, 1.3, 1.4, 2.5])
数学和统计方法
这些方法既可以当做实例方法调用 arr2d.sum()也可以通过 np.sum(arr2d)
sum 计算所有元素的和
mean 计算所有元素的均值
std/var 计算标准差和方差
min/max 最大值和最小值
argmin/argmax 最小值和最大值的索引
cumsum 返回一个所有元素累加的数组 累计和
cumprod 所有元素的累计积
用于布尔型数组的方法
- #True 直接当 1 计算
- In [24]: (arr2d<4).sum()
- Out[24]: 3
- In [25]: cond
- Out[25]: array([ True, False, True, True, False])
- In [26]: cond.any()
- Out[26]: True
- In [27]: cond.all()
- Out[27]: False
排序
np.sort() 这个会复制一个副本
arr2d.sort()是在源数据上的操作
5. 用于数组文件的输入输出
将数组以二进制形式保存到磁盘
- np.save()
- np.load()
存取文本文件
- np.loadtext()
- np.savetext()
6. 线性代数 找不到时就在 numpy.linalg
注: 转置 arr.T
np.dot(arr1,arr2) 两个矩阵的乘积
np.diag 返回对角线元素 / 或以一维数组转化为以此为对角线的方阵
trace() 计算对角线的和
det 计算 f 方阵的行列式值
eig 计算特征值和特征向量
inv 计算逆矩阵
pinv 计算伪逆矩阵
qr 计算 QR 分解
svd 计算奇异值分解
solve 解线性方程 Ax=b
lstsq 计算 Ax=b 的最小二乘解
7. 随机数生成 numpy.random 对 Python 内置的 random 进行了补充
seed 确定随机数生成的种子
permutation 返回一个序列的随机排列或返回一个随机排列的范围
shuffle 对一个序列就地随机排列
rand 产生均匀分布的样本值
randint 从给定的上下范围内随机选取整数
randn 产生正态分布的样本值
binomial 产生二项分布的样本值
normal 产生二项分布的样本值
beta 产生 Beta 分布的样本值
chisquare 产生卡方分布的样本值
gamma 产生 Gamma 分布的样本值
uniform 产生 (0,1) 均匀分布的样本值
来源: https://www.cnblogs.com/nadech/p/8973083.html