1.数组通用函数(ufunc):
通用函数(ufunc)是在ndarray数组中进行逐元素操作的函数,分为一元函数和二元函数。
- 一元函数:对ndarray中的数据执行元素级运算的函数
arr = np.arange(6).reshape(2,3)
arr
Out[4]:
array([[0, 1, 2],
[3, 4, 5]])
np.sqrt(arr)
Out[5]:
array([[0. , 1. , 1.41421356],
[1.73205081, 2. , 2.23606798]])
np.square(arr)
Out[6]:
array([[ 0, 1, 4],
[ 9, 16, 25]], dtype=int32)
函数 | 说明 |
---|---|
abs(x) fabs(x) | 计算数组各元素的绝对值 |
sqrt(x) | 计算数组各元素的平方根 |
square(x) | 计算数组各元素的平方 |
log(x) log10(x) log2(x) | 计算数组各元素的自然对数、10底对数、2底对数 |
ceil(x) floor(x) | 计算数组各元素的ceiling值或floor值 |
rint(x) | 计算数组各元素的四舍五入值 |
modf(x) | 计算数组各元素的小数和整数部分以两个独立数组形式返回 |
cos(x) cosh(x) sin(x) sinh(x) tan(x) tanh(x) | 计算数组各元素的三角函数 |
exp(x) | 计算数组各元素的指数值 |
sign(x) | 计算数组各元素的符号值,1(+),0,-1(-) |
- 二元函数:接收两个数组并返回一个数组作为结果
arr1 = np.random.randn(6).reshape(2,3)
arr2 = np.random.randn(6).reshape(2,3)
arr1
Out[9]:
array([[-0.10791009, -1.45209268, 0.14815903],
[ 0.75679391, 0.17230266, -1.99569305]])
arr2
Out[10]:
array([[ 0.42214747, 0.1487958 , 1.80359439],
[ 0.69593972, 0.13721871, -0.22506674]])
np.maximum(arr1,arr2)
Out[11]:
array([[ 0.42214747, 0.1487958 , 1.80359439],
[ 0.75679391, 0.17230266, -0.22506674]])
arr1 > arr2
Out[12]:
array([[False, False, False],
[ True, True, False]])
函数 | 说明 |
---|---|
+(add)-(subtract)×(multiply)/(divide、floor_divede) | 两个数组各元素进行对应加减乘除、整除运算 |
power(x,y) | 将第二个数组的元素作为第一个数组对应元素的幂次方 |
maximum(x,y) fmax() minimum(x,y) fmin() | 元素级的最大值、最小值计算 |
mod(x,y) | 元素级的模运算 |
copysign(x,y) | 将数组y中各元素的符号赋值给数组x对应元素 |
> < >= <= == != | 算术比较,产生布尔型数组 |
greater(x,y) greater_equal(x,y) less(x,y) less_equal(x,y) equal(x,y) not_equal(x,y) | 算术比较,产生布尔型数组,与数学操作符效果一致 |
logical_and(x,y) logical_or(x,y) logical_xor(x,y) | 元素级的逻辑操作,与逻辑操作符&、|、^ 效果一致 |
2.数组的where()函数:
where()函数是三元表达式x if condition eles y
的向量化版本
where()函数的后两个参数可以是标量也可以是数组。where()函数在数据分析中的一个典型用法就是根据一个数组生成一个新的数组。
arr = np.random.randn(3,3)
arr
Out[14]:
array([[-1.67054537, -1.00228755, 1.60466812],
[-1.54595476, 0.32293948, 0.22890502],
[ 0.3178935 , -0.501759 , -0.57045445]])
# 将数组arr中所有正值调换为1,所有负值替换为-1
np.where(arr>0,1,-1)
Out[15]:
array([[-1, -1, 1],
[-1, 1, 1],
[ 1, -1, -1]])
# 后面的参数也可以是标量
np.where(arr>0,1,arr)
Out[16]:
array([[-1.67054537, -1.00228755, 1. ],
[-1.54595476, 1. , 1. ],
[ 1. , -0.501759 , -0.57045445]])
3.数组基础统计方法:
arr = np.random.randn(3,4)
arr
Out[18]:
array([[-0.47572802, -0.4549984 , -1.76995714, -1.02534855],
[-1.06983373, 0.21870121, 0.58022886, 0.01403206],
[ 1.26014179, -0.40125443, -0.69471613, 0.17948693]])
arr.sum()
Out[19]: -3.639245556091149
arr.mean()
Out[20]: -0.30327046300759575
np.mean(arr)
Out[21]: -0.30327046300759575
统计函数可以接受一个可选的参数axis
,用于计算指定轴上的统计值,形成一个下降一维的数组。
arr.mean(axis=0)
Out[22]: array([-0.09513998, -0.21251721, -0.62814814, -0.27727652])
arr.mean(axis=1)
Out[23]: array([-0.93150803, -0.0642179 , 0.08591454])
有些方法,例如cumsum和cumprod方法并不会聚合,而是产生一个中间结果。
arr = np.arange(6).reshape(2,3)
arr
Out[27]:
array([[0, 1, 2],
[3, 4, 5]])
arr.cumsum()
Out[28]: array([ 0, 1, 3, 6, 10, 15], dtype=int32)
arr.cumprod()
Out[29]: array([0, 0, 0, 0, 0, 0], dtype=int32)
arr.cumsum(axis=0)
Out[30]:
array([[0, 1, 2],
[3, 5, 7]], dtype=int32)
arr.cumprod(axis=0)
Out[31]:
array([[ 0, 1, 2],
[ 0, 4, 10]], dtype=int32)
方法 | 说明 |
---|---|
sum() | 沿着轴向计算所有元素的累加和 |
mean() | 计算数学平均 |
std() var() | 计算标准差、方差 |
min() max() | 计算最小值、最大值 |
argmin() argmax() | 计算最小值、最大值的位置 |
cumsum() | 计算从0开始的元素累积和 |
cumprod() | 计算从1开始的元素累积积 |
4.数组的集合操作:
arr = np.array([2,3,4,5,6,7,8,9])
np.in1d(arr,[3,5,7])
Out[33]: array([False, True, False, True, False, True, False, False])
arr1 = np.array([2,3,4,5,6])
arr2 = np.array([6,7,8,9,10])
np.union1d(arr1,arr2)
Out[36]: array([ 2, 3, 4, 5, 6, 7, 8, 9, 10])
np.setxor1d(arr1,arr2)
Out[37]: array([ 2, 3, 4, 5, 7, 8, 9, 10])
np.setdiff1d(arr1,arr2)
Out[38]: array([2, 3, 4, 5])
方法 | 说明 |
---|---|
unique(x) | 计算x中的唯一值并排序 |
intersect1d(x,y) | 计算x和y的交集,并排序 |
union1d(x,y) | 计算x和y的并集,并排序 |
in1d(x,y) | 计算x中的元素是否包含在y中,返回布尔型数组 |
setdiff1d(x,y) | 计算x和y的差集,在x中但是不在y中的元素 |
setxor1d(x,y) | 计算x和y的异或集,在x或y中,但是不属于x和y交集的元素 |
5.数组的排序操作:
和Python类似,数组可以使用sort()
方法来进行排序操作。
在多维数组中,sort()
方法可以根据传递的axis参数值,沿着指定轴向进行排序。
arr = np.random.randn(3,4)
arr
Out[44]:
array([[ 1.60515118, 1.16753848, 1.51376801, 0.01441127],
[-0.03171163, 0.94396298, 0.41288009, -0.86564647],
[ 1.19708637, -1.24565881, -1.58869026, -0.11359642]])
arr.sort()
arr
Out[46]:
array([[ 0.01441127, 1.16753848, 1.51376801, 1.60515118],
[-0.86564647, -0.03171163, 0.41288009, 0.94396298],
[-1.58869026, -1.24565881, -0.11359642, 1.19708637]])
arr.sort(0)
arr
Out[48]:
array([[-1.58869026, -1.24565881, -0.11359642, 0.94396298],
[-0.86564647, -0.03171163, 0.41288009, 1.19708637],
[ 0.01441127, 1.16753848, 1.51376801, 1.60515118]])
6.布尔值数组的操作:
对于布尔值数组,any()
方法用于检查数组中是否至少有一个True,all()
方法用于检查数组汇总是否每个值都是True。
arr = np.random.randn(3,4)
arr
Out[59]:
array([[ 0.36222056, -1.48478244, 0.56110975, -1.07177149],
[-1.31626641, -1.56700112, -0.1727941 , -0.11414005],
[ 0.10356325, 0.22232551, -0.39910697, 1.45211822]])
arr = arr > 0
arr
Out[61]:
array([[ True, False, True, False],
[False, False, False, False],
[ True, True, False, True]])
arr.any()
Out[62]: True
arr.all()
Out[63]: False
Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》