python传递上一个类计算值,python数据分析之Numpy数据库第三期数组的运算

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

数组和标量间的运算

数组之所以强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化

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帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值