python数组求和函数_python数据分析之Numpy数据库第三期数组的运算
上期數(shù)組的索引和切片的知識(shí)總結(jié)通道:數(shù)組的索引和切片
數(shù)組和標(biāo)量間的運(yùn)算
數(shù)組之所以強(qiáng)大而且重要的原因,是其不需要通過(guò)循環(huán)就可以完成批量計(jì)算,也就是矢量化
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])
相同維度的數(shù)組的算術(shù)運(yùn)算都可以直接應(yīng)用到元素中,也就是元素級(jí)運(yùn)算
arr*arr
out[3]:
array([1, 4, 9])
arr - arr
out[4];
array([0, 0, 0])
通用函數(shù)
通用函數(shù)(ufunc)是一種對(duì)數(shù)組中的數(shù)據(jù)執(zhí)行元素級(jí)運(yùn)算的函數(shù)。例如:通過(guò)abs函數(shù)求絕對(duì)值,square函數(shù)求平方
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]])
以上函數(shù)都是傳入一個(gè)數(shù)組,所以這些函數(shù)都是一元函數(shù)。有些函數(shù)需要傳入倆個(gè)數(shù)組并返回一個(gè)數(shù)組,這些函數(shù)被稱為二元函數(shù)。例如:add函數(shù)用于倆個(gè)數(shù)組相加,minimun函數(shù)可以計(jì)算元素最小值。
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])
有些通用函數(shù)還可以返回倆個(gè)數(shù)組,例如:modf函數(shù),可以返回?cái)?shù)組元素的小數(shù)和整數(shù)部分
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.]]))
條件邏輯運(yùn)算
首先創(chuàng)建三個(gè)數(shù)組
arr1 = np.array([1,2,3,4])
arr2 = np.array([5,6,7,8])
cond = np.array([True,False,False,True])
如果需要通過(guò)cond的值來(lái)選取arr1和arr2的值,當(dāng)cond為True時(shí),選擇arr1否則選擇arr2的值,那么可以通過(guò)if語(yǔ)句判斷來(lái)實(shí)現(xiàn)。
result = [(x if c else y) for x,y,c in zip(arr1,arr2,cond)]
result
out[14];
[1, 6, 7, 4]
但這種方法存在倆個(gè)問(wèn)題:第一,對(duì)大規(guī)模數(shù)組處理速度不是很快;第二,無(wú)法用于多維數(shù)組。若使用Numpy的where函數(shù)則可以解決這倆個(gè)問(wèn)題
result = np.where(cond,arr1,arr2)
result
out[15]:
array([1, 6, 7, 4])
where函數(shù)中的第二個(gè)和第三個(gè)參數(shù)可以為標(biāo)量。在數(shù)據(jù)分析,經(jīng)常需要通過(guò)一些條件將數(shù)組進(jìn)行處理。例如新建一個(gè)隨機(jī)符合正態(tài)分布的數(shù)組,通過(guò)數(shù)據(jù)處理將正值替換為1,負(fù)值替換為-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函數(shù)可以進(jìn)行多條件的判別。np.where函數(shù)通過(guò)嵌套的where表達(dá)式也可以完成同樣的功能
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]])
統(tǒng)計(jì)運(yùn)算
Numpy庫(kù)支持對(duì)整個(gè)數(shù)組或按指定軸向的數(shù)據(jù)進(jìn)行統(tǒng)計(jì)計(jì)算,例如,sum函數(shù)用于求和;mean函數(shù)用于求算術(shù)平均數(shù);std函數(shù)用于求標(biāo)準(zhǔn)差。
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
上面這些函數(shù)也可以傳入axis參數(shù),用于計(jì)算指定軸方向的統(tǒng)計(jì)值
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方法會(huì)產(chǎn)生計(jì)算結(jié)果組成的數(shù)組
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)
#基本數(shù)組的統(tǒng)計(jì)方法
#方法 使用說(shuō)明
#sum 求和
#mean 算術(shù)平均數(shù)
#std、var 標(biāo)準(zhǔn)差和方差
#min、max 最小值和最大值
#argmin、argmax 最小和最大元素的索引
#cumsum 所有元素的累計(jì)和
#cumprod 所有元素的累計(jì)積
布爾型數(shù)組運(yùn)算
對(duì)于布爾型數(shù)組,其布爾值會(huì)被強(qiáng)制轉(zhuǎn)換為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也可以用于布爾型數(shù)組運(yùn)算。any方法用于測(cè)試數(shù)組中是否存在一個(gè)或多個(gè)True;all方法用于查找數(shù)組中的所有值是否為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數(shù)組也可以通過(guò)sort()方法進(jìn)行排序
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])
對(duì)于多維數(shù)組,可以通過(guò)指定軸方向進(jìn)行排序
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]])
集合運(yùn)算
Numpy庫(kù)中提供了針對(duì)一維數(shù)組的基本集合運(yùn)算。在數(shù)據(jù)分析中,常用np.unique方法找出數(shù)組中的唯一值。
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])
注意:唯一值進(jìn)行了排序
np.in1d方法用于測(cè)試幾個(gè)數(shù)組中是否包含相同的值,返回一個(gè)布爾值數(shù)組。
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])
#數(shù)組的集合運(yùn)算
#方法 使用說(shuō)明
#unique(x) 唯一值
#intersect1d(x,y) 公共元素
#union1d(x,y) 并集
#in1d(x,y) x的元素是否在y中,返回布爾型數(shù)組
#setdiff1d(x,y) 集合的差
#setxor1d(x,y) 交集取反
線性代數(shù)
對(duì)于矩陣而言,需要求的是點(diǎn)積,這里Numpy庫(kù)提供了用于矩陣乘法的dot函數(shù)
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]])
對(duì)于更多的矩陣計(jì)算,可通過(guò)Numpy庫(kù)的linalg模塊來(lái)完成
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
注意:更多的矩陣運(yùn)算說(shuō)明可查看linalg幫助
總結(jié)
以上是生活随笔為你收集整理的python数组求和函数_python数据分析之Numpy数据库第三期数组的运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 拦截锚点修改url_浅谈URL跳转与We
- 下一篇: python高维向量的可视化_Tenso