python数据分析之Numpy数据库第三期数组的运算

本文深入探讨了Python数据分析库Numpy中数组的运算,包括数组与标量间的运算,如矢量化计算;通用函数(ufunc),如abs和square;条件逻辑运算,利用where函数进行高效的选择;统计运算,如sum、mean和std;布尔型数组运算,如any和all方法;排序功能;集合运算,如unique和in1d;以及线性代数操作,如矩阵乘法和线性代数函数。
摘要由CSDN通过智能技术生成

上期数组的索引和切片的知识总结通道:数组的索引和切片

数组和标量间的运算

数组之所以强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化
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='<U6')
np.unique(fruits)

out[39]:

array(['apple', 'banana', 'pear'], dtype='<U6')
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帮助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值