赞
踩
上期数组的索引和切片的知识总结通道:数组的索引和切片
数组和标量间的运算
数组之所以强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化
import numpy as np
a = [1,2,3]
b=[]
for i in a:
b.append(i*10)
b
out[1]:
[10, 20, 30]
arr = np.array([1,2,3])
arr *10
out[2]:
array([10, 20, 30])
相同维度的数组的算术运算都可以直接应用到元素中,也就是元素级运算
arr*arr
out[3]:
array([1, 4, 9])
arr - arr
out[4];
array([0, 0, 0])
通用函数
通用函数(ufunc)是一种对数组中的数据执行元素级运算的函数。例如:通过abs函数求绝对值,square函数求平方
arr = np.random.randn(3,3)
arr
out[5];
array([[-0.17634898, 1.24131891, -1.55449196],
[ 0.04820966, -0.1420969 , -0.80747892],
[-0.05187637, 0.41997844, -2.12123818]])
np.abs(arr)
out[6]:
array([[0.17634898, 1.24131891, 1.55449196],
[0.04820966, 0.1420969 , 0.80747892],
[0.05187637, 0.41997844, 2.12123818]])
np.square(arr)
out[7];
array([[3.10989635e-02, 1.54087265e+00, 2.41644525e+00],
[2.32417090e-03, 2.01915297e-02, 6.52022212e-01],
[2.69115814e-03, 1.76381893e-01, 4.49965142e+00]])
以上函数都是传入一个数组,所以这些函数都是一元函数。有些函数需要传入俩个数组并返回一个数组,这些函数被称为二元函数。例如:add函数用于俩个数组相加,minimun函数可以计算元素最小值。
arr1 = np.random.randint(1,10,size = (5))
arr1
out[8]:
array([1, 8, 3, 2, 1])
arr2 = np.random.randint(1,10,size = (5))
arr2
out[9];
array([4, 8, 7, 4, 3])
np.add(arr1,arr2)
out[10]:
array([ 5, 16, 10, 6, 4])
np.minimum(arr1,arr2)
out[11]
array([1, 8, 3, 2, 1])
有些通用函数还可以返回俩个数组,例如:modf函数,可以返回数组元素的小数和整数部分
arr1 = np.random.normal(2,4,size=(6,))
arr
out[12]:
array([[-0.17634898, 1.24131891, -1.55449196],
[ 0.04820966, -0.1420969 , -0.80747892],
[-0.05187637, 0.41997844, -2.12123818]])
np.modf(arr)
out[13]:
(array([[-0.17634898, 0.24131891, -0.55449196],
[ 0.04820966, -0.1420969 , -0.80747892],
[-0.05187637, 0.41997844, -0.12123818]]),
array([[-0., 1., -1.],
[ 0., -0., -0.],
[-0., 0., -2.]]))
条件逻辑运算
首先创建三个数组
arr1 = np.array([1,2,3,4])
arr2 = np.array([5,6,7,8])
cond = np.array([True,False,False,True])
如果需要通过cond的值来选取arr1和arr2的值,当cond为True时,选择arr1否则选择arr2的值,那么可以通过if语句判断来实现。
result = [(x if c else y) for x,y,c in zip(arr1,arr2,cond)]
result
out[14];
[1, 6, 7, 4]
但这种方法存在俩个问题:第一,对大规模数组处理速度不是很快;第二,无法用于多维数组。若使用Numpy的where函数则可以解决这俩个问题
result = np.where(cond,arr1,arr2)
result
out[15]:
array([1, 6, 7, 4])
where函数中的第二个和第三个参数可以为标量。在数据分析,经常需要通过一些条件将数组进行处理。例如新建一个随机符合正态分布的数组,通过数据处理将正值替换为1,负值替换为-1.
arr = np.random.randn(4,4)
arr
out[16]:
array([[-0.47119857, 0.74300761, -2.02821269, -0.3549485 ],
[ 1.36356163, -0.61257804, 0.48115343, 0.86997115],
[-0.4559936 , 0.26179048, -1.20468106, -0.56509321],
[-0.23739251, 0.83751607, -0.33541895, 0.76305371]])
new_arr = np.where(arr>0,1,-1)
new_arr
out[17]
array([[-1, 1, -1, -1],
[ 1, -1, 1, 1],
[-1, 1, -1, -1],
[-1, 1, -1, 1]])
使用elif函数可以进行多条件的判别。np.where函数通过嵌套的where表达式也可以完成同样的功能
arr = np.random.randint(1,300,size=(3,3))
arr
out[18];
array([[203, 102, 270],
[136, 60, 106],
[126, 97, 64]])
new_arr = np.where(arr > 200,3,
np.where(arr>100,2,1))
new_arr
out[19]:
array([[3, 2, 3],
[2, 1, 2],
[2, 1, 1]])
统计运算
Numpy库支持对整个数组或按指定轴向的数据进行统计计算,例如,sum函数用于求和;mean函数用于求算术平均数;std函数用于求标准差。
arr = np.random.randn(4,4)
arr
out[20]
array([[ 0.30819793, -1.06144959, 1.46672816, 1.18847115],
[ 0.87732943, -1.58171074, -0.6957929 , 0.72827265],
[ 0.31470934, -0.46280001, -0.40335385, 1.52528851],
[ 2.28676812, 0.20790929, -0.11272405, 1.74249516]])
arr.sum()
out[21];
6.328338600041427
arr.mean()
out[22];
0.3955211625025892
arr.std()
out[23]
1.0515585180241533
上面这些函数也可以传入axis参数,用于计算指定轴方向的统计值
arr.mean(axis=1)
out[24];
array([ 0.47548691, -0.16797539, 0.243461 , 1.03111213])
arr.sum(0)
out[25]:
array([ 3.78700481, -2.89805105, 0.25485737, 5.18452746])
cumsum和cumpod方法会产生计算结果组成的数组
arr = np.arange(9).reshape(3,3)
arr
out[26]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
arr.cumsum(0)
out[27];
array([[ 0, 1, 2],
[ 3, 5, 7],
[ 9, 12, 15]], dtype=int32)
arr.cumprod(1)
out[28]
array([[ 0, 0, 0],
[ 3, 12, 60],
[ 6, 42, 336]], dtype=int32)
#基本数组的统计方法
#方法 使用说明
#sum 求和
#mean 算术平均数
#std、var 标准差和方差
#min、max 最小值和最大值
#argmin、argmax 最小和最大元素的索引
#cumsum 所有元素的累计和
#cumprod 所有元素的累计积
布尔型数组运算
对于布尔型数组,其布尔值会被强制转换为1(True)和0(False)
arr = np.random.randn(20)
arr
out[29]:
array([-0.42961012, 0.56609038, -1.1741952 , -0.75376119, -1.09201392,
1.43960879, 0.87644242, -0.5947441 , 1.08380455, -0.06300785,
0.95369943, -1.27213285, 0.05017716, 0.27420381, -0.09095471,
-1.35379462, 0.61902337, -0.59390741, -0.22647004, -0.03306254])
(arr > 0).sum()
out[30]:
8
另外还有俩种方法any和all也可以用于布尔型数组运算。any方法用于测试数组中是否存在一个或多个True;all方法用于查找数组中的所有值是否为True
arr = np.array([True,False,False,True])
arr
out[31]:
array([ True, False, False, True])
arr.any()
out[32];
True
arr.all()
out[33]:
False
排序
与python列表类似,Numpy数组也可以通过sort()方法进行排序
arr = np.random.randn(10)
arr
out[34]:
array([ 2.2119974 , -1.52764083, 0.56082579, 0.14395966, 1.89882088,
0.70710935, -1.89196899, -2.40109916, 1.64130244, 2.65960228])
arr.sort()
arr
out[35]:
array([-2.40109916, -1.89196899, -1.52764083, 0.14395966, 0.56082579,
0.70710935, 1.64130244, 1.89882088, 2.2119974 , 2.65960228])
对于多维数组,可以通过指定轴方向进行排序
arr = np.random.randn(5,3)
arr
out[36]:
array([[ 2.45789818, 0.36223423, -0.77491822],
[-0.90154818, 0.03508642, 0.59097629],
[-1.11291537, 0.69388491, -0.53710136],
[ 0.3184309 , -0.1081375 , -0.65716382],
[-0.71120618, 1.60547342, -0.11556702]])
arr.sort(1)
arr
out[37]:
array([[-0.77491822, 0.36223423, 2.45789818],
[-0.90154818, 0.03508642, 0.59097629],
[-1.11291537, -0.53710136, 0.69388491],
[-0.65716382, -0.1081375 , 0.3184309 ],
[-0.71120618, -0.11556702, 1.60547342]])
集合运算
Numpy库中提供了针对一维数组的基本集合运算。在数据分析中,常用np.unique方法找出数组中的唯一值。
fruits = np.array(['apple','banana','pear','banana','pear','apple','pear'])
fruits
out[38]:
array(['apple', 'banana', 'pear', 'banana', 'pear', 'apple', 'pear'],
dtype='
np.unique(fruits)
out[39]:
array(['apple', 'banana', 'pear'], dtype='
arr = np.array([2,3,3,2,8,1])
arr
out[40]:
array([2, 3, 3, 2, 8, 1])
np.unique(arr)
out[41]:
array([1, 2, 3, 8])
注意:唯一值进行了排序
np.in1d方法用于测试几个数组中是否包含相同的值,返回一个布尔值数组。
arr = np.array([2,3,5,7])
arr
out[42]:
array([2, 3, 5, 7])
np.in1d(arr,[2,7])
out[43]:
array([ True, False, False, True])
#数组的集合运算
#方法 使用说明
#unique(x) 唯一值
#intersect1d(x,y) 公共元素
#union1d(x,y) 并集
#in1d(x,y) x的元素是否在y中,返回布尔型数组
#setdiff1d(x,y) 集合的差
#setxor1d(x,y) 交集取反
线性代数
对于矩阵而言,需要求的是点积,这里Numpy库提供了用于矩阵乘法的dot函数
arr1 = np.array([[1,2,3],[4,5,6]])
arr1
out[44]:
array([[1, 2, 3],
[4, 5, 6]])
arr2 = np.arange(9).reshape(3,3)
arr2
out[45]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
np.dot(arr1,arr2)
out[46]:
array([[24, 30, 36],
[51, 66, 81]])
对于更多的矩阵计算,可通过Numpy库的linalg模块来完成
from numpy.linalg import det
arr = np.array([[1,2],[3,4]])
arr
out[47]:
array([[1, 2],
[3, 4]])
det(arr)
out[48]:
-2.0000000000000004
注意:更多的矩阵运算说明可查看linalg帮助
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。