前言
前一篇文章我们已经对Numpy有了一个大概的认识,了解了ndarray的几种创建方法,它的索引与切片相关内容以及一些换轴操作。今天我们就来更加深入的了解Numpy的相关操作。
通用函数
通用函数,又可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数,有很多ufunc是简单的逐元素转换,它们被称为一元通用函数,比如sqrt或exp函数,分别进行开方操作和以e为底的指数。
代码如下
import numpy as np
arr = np.arange(10)
print(arr)
print(np.sqrt(arr))
print(np.exp(arr))
结果如下
[0 1 2 3 4 5 6 7 8 9]
[0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
二元通用函数会接受两个数组作为参数,并且返回一个数组作为结果。例如add,maximum。maximum计算两个
代码如下
import numpy as np
arr1 = np.random.randn(8)
arr2 = np.random.randn(8)
print(arr1)
print(arr2)
print(np.add(arr1, arr2))
print(np.maximum(arr1, arr2))
结果如下
[-0.87594347 -0.12273679 -0.14468199 0.79499301 0.48304519 1.42611994
0.18478049 -0.77634734]
[-1.22720664 -0.5021539 -0.46341915 -1.09360896 -0.11567866 1.44262963
1.3676035 0.87728414]
[-2.10315011 -0.62489069 -0.60810113 -0.29861595 0.36736653 2.86874957
1.55238399 0.1009368 ]
[-0.87594347 -0.12273679 -0.14468199 0.79499301 0.48304519 1.44262963
1.3676035 0.87728414]
常用的通用函数如下
一元通用函数
函数名 | 描述 |
---|---|
abs | 计算绝对值 |
aqrt | 计算平方根(与arr**0.5相等) |
square | 计算平方(与arr**2相等) |
二元通用函数
函数名 | 描述 |
---|---|
add | 相加 |
subtract | 在第二个数组中,将第一个数据包含的元素去除 |
multiply | 将数组元素相乘 |
divide,floor_divide | 除或整除 |
power | 将第二个数组的值作为第一个数组的幂次方 |
maximum, fmax | 计算最大值,fmax忽略NaN |
minimum,fmin | 计算最小值,fmin忽略NaN |
mod | 求模 |
面向数组编程
使用NumPy数组可以使你利用简单的数组表达式完成多种数据操作任务,而无需写些大量循环。这种利用数组表达式代替显示循环的方法称为向量化。
在NumPy中np.where就是三元表达式 x if condition else y的向量化版本。where在数据分析中的一个典型用法就是根据一个数组来生成一个新的数组。比如说你想将一个数组中的所有正值替换为2,所有负值替换为-2,用where实现就会非常简单,例子如下。
import numpy as np
arr = np.random.randn(4, 4)
arr1 = np.where(arr > 0, 2, -2)
print(arr)
print(arr1)
结果如下
[[-0.96494491 0.07379061 -1.27861559 1.00250552]
[ 1.92868117 -0.71947891 -0.46209623 -0.25288092]
[ 0.02809471 0.0156134 -0.41930177 0.4971246 ]
[ 2.34854456 0.53715659 1.29290707 -1.5782504 ]]
[[-2 2 -2 2]
[ 2 -2 -2 -2]
[ 2 2 -2 2]
[ 2 2 2 -2]]
数学与统计方法
许多关于计算整个数组统计值或者关于轴向数据的数学函数,可以作为数组类型的方法被调用,也可以调用顶层的NumPy函数。例子如下,mean是求平均值的函数。
代码如下
import numpy as np
arr = np.random.randn(5, 4)
print(arr)
print(arr.mean())
print(np.mean(arr))
结果如下
[[ 1.24215748 0.29118319 -0.15095341 -1.18315436]
[ 0.34114254 0.67807088 -0.35850545 -0.0283722 ]
[ 0.49374135 2.20303723 1.16090384 0.48882664]
[ 0.7933995 -0.87707374 1.16431334 -0.9578789 ]
[-0.96946034 0.80809035 1.2987827 -0.18680409]]
0.3125723270734698
0.3125723270734698
像mean、sum等函数可接收一个可选参数axis,这个参数可以用于计算定轴向上的统计值,形成一个下降一维度的数组,例如arr.mean(1)表示计算每一列的平均值,arr.sum(0)表示计算每一行的和。
代码如下
import numpy as np
arr = np.random.randn(5, 4)
print(arr)
print(arr.mean(1))
print(arr.sum(0))
结果如下
[[ 0.73681373 -0.47219867 -1.79257559 0.61201661]
[-0.36828573 -0.94568274 0.19655693 -0.51870822]
[-2.28839471 0.1913941 0.45310426 0.72263832]
[ 0.78532131 0.86428249 -0.7225563 -0.6953199 ]
[ 0.71222315 0.2859414 1.89264378 -0.60046051]]
[-0.22898598 -0.40902994 -0.23031451 0.0579319 0.57258696]
[-0.42232225 -0.07626342 0.02717308 -0.47983371]
基础数组统计方法
方法 | 描述 |
---|---|
sum | 沿着轴向计算所有元素累计和,0长度数组累计和为0 |
mean | 数学平均,0长度的数组平均值为NaN |
std,var | 标准差和方差 |
min, max | 最小值和最大值 |
argmin, argmax | 最小值和最大值的位置 |
cumsum | 从0开始元素累计和 |
cumprod | 从1开始累积积 |
前面介绍过,布尔值会被强制为1(True)和0(False),因此sum通常可以用于计算布尔数组中True的个数。
代码如下
import numpy as np
arr = np.random.randn(5, 4)
print(arr)
print((arr > 0).sum())
结果如下
[[ 6.71705665e-02 1.61629530e-02 1.76841029e+00 4.23138695e-01]
[ 1.12480214e-03 -4.01747051e-01 7.13198516e-01 2.19474387e+00]
[ 1.72505405e+00 -7.08562407e-01 4.29636061e-01 1.03900746e-01]
[-5.64386934e-01 1.94245960e+00 -3.59287169e-01 -1.57861659e+00]
[-2.87704451e-01 -5.07660259e-01 5.56993656e-01 1.28515104e+00]]
13
唯一值与其他集合逻辑
Numpy包含了一些针对一维ndarray的基础集合操作,常用的一个方法是np.unique,返回数组中唯一值排序后形成的数组。
代码如下
import numpy as np
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print(np.unique(names))
结果如下
['Bob' 'Joe' 'Will']
数组的集合操作
方法 | 描述 |
---|---|
unique(x) | 计算x的唯一值,并排序 |
intersect1d(x, y) | 计算x和y的交集并排序 |
union1d(x, y) | 计算x和y的并集并排序 |
in1d(x, y) | 计算x是否包含y,返回一个布尔值 |
setdiff1d(x,y) | 计算差集,在x中但不在y中的x的元素 |
setxor1d(x,y) | 计算异或,在x或y中,但不属于x,y交集的元素 |
线性代数
线性代数,比如矩阵乘法、分解、行列式等方阵是所有数组类库的重要组成部分。
方法 | 描述 |
---|---|
diag | 将一个方阵的对角元素作为一维数组返回,或者将一维数组换成一个方阵 |
dot | 矩阵点乘 |
trace | 计算对角元素和 |
det | 计算矩阵行列式 |
eig | 计算方阵的特征值和特征向量 |
inv | 计算方阵的逆矩阵 |
svd | 奇异值分解 |
lstsq | 计算Ax = b的最小二乘解 |
最后
今天我们了解了NumPy的通用函数、面向数组的编程和一些线性代数的相关内容。更多的精彩文章可以关注公众号QStack。