numpy 相关函数
1.numpy.ndim
a,b的ndim是指數(shù)組的行數(shù),或者說是數(shù)組第一維是多少。就是數(shù)組的維數(shù),對于二維可以用array[x][y],三維可以用array[x][y][z].你可以想成二維的是一個灰度圖像,三維的是rgb這種多通道圖像
2.numpy.shape 返回數(shù)組維數(shù)的元組
>>> y=np.zeros((2,3,4)) >>> y.shape (2, 3, 4) #表示2個3維4列的數(shù)組組成 >>> y array([[[ 0., 0., 0., 0.],[ 0., 0., 0., 0.],[ 0., 0., 0., 0.]],[[ 0., 0., 0., 0.],[ 0., 0., 0., 0.],[ 0., 0., 0., 0.]]]) >>> b=np.array([[1.5,2.,3.],[4.,5.,6.]]) >>> b.ndim 2 >>> b.shape #返回2行3列的數(shù)組,2表示行數(shù),3表示列數(shù) (2, 3) >>> b.shape[0] #返回的是幾行即幾維 2 >>> b.shape[1] #返回的是幾列 33.numpy.random.seed(0)的作用
使得隨機數(shù)據(jù)可預測,當我們設置相同的seed,每次生成的隨機數(shù)相同。如果不設置seed,則每次會生成不同的隨機數(shù).
4.numpy.concatenate數(shù)組拼接
numpy.concatenate((a1,a2,…), axis=0)函數(shù),能夠一次完成多個數(shù)組的拼接。其中a1,a2,…是數(shù)組類型的參數(shù)。
對numpy.append()和numpy.concatenate()兩個函數(shù)的運行時間進行比較,concatenate()效率更高,適合大規(guī)模的數(shù)據(jù)拼接
>>> from time import clock as now >>> a=np.arange(9999) >>> b=np.arange(9999) >>> time1=now() >>> c=np.append(a,b) >>> time2=now() >>> print time2-time1 28.2316728446 >>> a=np.arange(9999) >>> b=np.arange(9999) >>> time1=now() >>> c=np.concatenate((a,b),axis=0) >>> time2=now() >>> print time2-time1 20.39349971075.numpy中的inf表示一個無限大的正數(shù)
import numpy x = numpy.inf x>9999999999999999999 #返回結果為:True6.astype改變array數(shù)組內數(shù)值的類型
#用法1:直接將原來的類型轉換成現(xiàn)在指定的類型 numeric_strings=np.array(['1.25','-9.6','42'],dtype=np.string_) numeric_strings=numeric_strings.astype(float) #沒寫np.float64,因為python類型會映射到等價的dtype上#用法2:可直接引用另外一個變量的dtype,基要和另一個數(shù)組一樣的類型則直接用該數(shù)組.dtype int_array=np.arange(10) #輸出是:array([0,1,2,3,4,5,6,7,8,9]) calibers=np.array([.22,.270,.33],dtype=np.float64) int_array=int_array.astype(calibers.dtype) #將前面的int的奕成float64 #print_array的值為:array([0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,])7.切片與python代碼的不同點
當你將一個標量值(一維中的都是單個詞,這里標量指的就是單個值)賦值給一個切片時(如arr[5:8]=12),該值會自動傳播(即”廣播”)到整個選區(qū)。
與列表最重要的區(qū)別在于,numpy中的數(shù)組切片是原始數(shù)組的視圖,這意味著數(shù)據(jù)不會被復制,
視圖上的任何修改都會直接反映到源數(shù)組上。即映射到原來數(shù)組上
8.多維數(shù)組中元素索引
多維數(shù)組取某個元素值
多維數(shù)組元素索引
#下面是2X2X3的數(shù)組,即2個2維3列的數(shù)組 arr3d=np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) print arr3d #輸出的結果如下[[[ 1 2 3][ 4 5 6]] [[ 7 8 9][10 11 12]]]#取出arr3d[0] print arr3d[0] #結果:取出第一個數(shù)組:[[1,2,3],[4,5,6]]標量值和數(shù)組都可以被賦值
old_values=arr3d[0].copy() #old_values就是上面arr3d[0]的值 arr3d[0]=42 #arr3d[0]的數(shù)組的值都為42 print arr3d #輸出結果如下 # [[[42 42 42] # [42 42 42]] # # [[ 7 8 9] # [10 11 12]]] arr3d[0]=old_values #old_values的值賦值給arr3d[0]中 print arr3d #輸出結果如下: # [[[ 1 2 3] # [ 4 5 6]] # # [[ 7 8 9] # [10 11 12]]]以此類推,arr3d[1,0]可以訪問索引以(1,0)開頭的那些值(以一維數(shù)組的形式返回):
print arr3d[1,0]
返回的結果是:array([7,8,9])
9.多維數(shù)組中切片索引
arr2d=np.array([[1,2,3],[4,5,6],[7,8,9]]) print arr2d print arr2d[:2] #輸出結果是:array([[1,2,3],[4,5,6]]) print arr2d[:2,1:] #在前面取出的arr2d[:2]的基礎上再取各個數(shù)組的從1:開始 #輸出結果 # [[2 3] # [5 6]] print arr2d[1,:2] #先取出1的數(shù)組(從0開始的),即[4,5,6],再:2是取從頭取到第2個,但不包括位置為2的值,即[4,5] #輸出結果為: # array[4 5] print arr2d[2,:1] #如上,得到的結果是:array([7])注意:“只有冒號”表示選取整個軸,如下
print arr2d[:,:1] #第一個:表示所有軸都選中,第2個:1是取每個數(shù)組的第一個值 #輸出結果是: [[1][4][7]]對切片表達式的賦值操作也會被擴散到整個選區(qū):
arr2d[:2,1:]=0 #先取位置為0:2不包括2的位置的數(shù)組即[[1,2,3],[4,5,6]], # 后面的1:是從位置為1開始一直取到結束即[8,9]位置都賦0 print arr2d #輸出結果如下: [[1 0 0][4 0 0][7 8 9]]10.布爾索引
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe']) data=np.random.rand(7,4) #隨行生成7行4列的數(shù)組 print data print names print names=='Bob' #輸出的結果是:[ True False False True False False False]print data[names=='Bob'] #因為names=='Bob'為True有兩個,則生成2行4列的隨機數(shù)組print names!='Bob' #輸出結果是:[False True True False True True True] print data[(names!='Bob')] ##因為names!='Bob'有5個為True的,則生成5行4列的隨機數(shù)組 #使用算術運算符:&,| mask=(names=='Bob') | (names=='Will') #[ True False True True True False False]print mask print data[mask] #因為mask為True的有4個,則生成4行4列的數(shù)組布爾型數(shù)組和切片混合使用 print data[names=='Bob',2:] #data[names=='Bob']中每個數(shù)組中取2:位置開始到最后的元素 # data[names=='Bob']的結果是: # [[ 0.90203958 0.02821906 0.30351464 0.33156672] # [ 0.60263345 0.97656289 0.58361359 0.06398002]] #然后data[names=='Bob',2:]之后的結果是: # [[ 0.30351464 0.33156672] # [ 0.58361359 0.06398002]] print data[names=='Bob',3] #data[names=='Bob']中每個數(shù)組中取3這個位置的數(shù) #輸出的結果是: # [ 0.33156672 0.06398002]通過布爾型索引選取數(shù)組中的數(shù)據(jù),將總是創(chuàng)建數(shù)據(jù)的副本,即使返回一模一樣的數(shù)組也是如此。
通過布爾型數(shù)組設置值是一種經常用到的手段。如將data中的所有負值都設置為0,我們只需如下:
通過一維布爾數(shù)組設置整行或列的值也很簡單:
data[names!='Joe']=7 #不是Joe的為True,有多少個True就總共該data數(shù)組有 #少行,將為True的這一行的值都為7 print data #返回的結果如下: [[ 7. 7. 7. 7. ][ 0.11834433 0.25350225 0.45062154 0.1694289 ][ 7. 7. 7. 7. ][ 7. 7. 7. 7. ][ 7. 7. 7. 7. ][ 0.7159481 0.70406219 0.50870176 0.8419536 ][ 0.97546717 0.36981413 0.35265204 0.88268987]]11.花式索引
它指的是利用整數(shù)數(shù)組進行索引
負數(shù)索引,從尾部開始
print arr[[-3,-5,-7]] #輸出的結果如下: # [[ 5. 5. 5. 5.] # [ 3. 3. 3. 3.] # [ 1. 1. 1. 1.]]一次傳入多個索引數(shù)組會有一點特別,它返回的是一個一維數(shù)組,其中的元素對應各個索引元組
arr=np.arange(32).reshape((8,4)) #arange(32)即32個數(shù)(從0-31),數(shù)組的shape是8行4列 print arr #返回結果如下: # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11] # [12 13 14 15] # [16 17 18 19] # [20 21 22 23] # [24 25 26 27] # [28 29 30 31]] print arr[[1,5,7,2],[0,3,1,2]] #第一個數(shù)組是取出的行,例1表示下標為1的行取出(下標是從0開始),則取出的是[4 5 6 7] #第二個數(shù)組是在前面取出的行的行幾個元素,上面是1行對應的是0下標元素,由取第1行的第一個元素,即4,所以第一個數(shù)是4, #依此類推,最終選出的元素是(1,0),(5,3),(7,1),(2,2).第2個數(shù)是:下標為5的行位置為3的元素,即23. #輸出的結果如下: # [ 4 23 29 10]要得到多維數(shù)組則要[:, ]將整行取出
print arr[[1,5,7,2]][:,[0,3,1,2]] #先取出[1,5,7,2]行,再[:,]取一整行,[0,3,1,2]是一整行元素的取值,先 #取的是0元素,再取3(該行的第4個元素),再取1(第2個元素),最后取2(第3個元素) #輸出的結果如下: # [[ 4 7 5 6] # [20 23 21 22] # [28 31 29 30] # [ 8 11 9 10]]花式索引跟切片不一樣,它總是將數(shù)據(jù)復制到新數(shù)組中。
12.數(shù)組轉置和軸對換
transpose方法
ndarray還有一個swapaxes方法,它需要接受一對輛編號
print arr.swapaxes(1,2) #輸?shù)浇Y果如下: # [[[ 0 4] # [ 1 5] # [ 2 6] # [ 3 7]] # # [[ 8 12] # [ 9 13] # [10 14] # [11 15]]]13.快速的元素級數(shù)組函數(shù)
#例如:sqrt,exp等一元的 arr=np.arange(10) print np.sqrt(arr) #開方 print np.exp(arr)#add,max接受兩個數(shù)組的,叫二元,并返回一個結果數(shù)組 x=random.rand(8) y=random.rand(8) print x print y print np.maximum(x,y) #元素級最大值,取x,y各對應的比較。如x[0]和y[0]比較,哪個大就放在np.maximum(x,y)生成新的數(shù)組中arr=random.rand(7)*5 print np.modf(arr)一元是針對數(shù)組里的各個元素,二元是針對兩個數(shù)組中各對應的元素
(如:x(1)-y(1),即相同位置的值進行操作)
一元的ufunc函數(shù):
二元的ufunc函數(shù):需要兩個數(shù)組的
add 相加 subtract 第一個數(shù)組減第二個數(shù)組 multiply 各元素相乘 divide,floor_divide 除法或向下圓整除法(丟棄余數(shù)) power 對第一個數(shù)組中的元素A,根據(jù)第二個數(shù)組中的相應元素B,計算A的B次方 maximum,fmaxt 元素級的最大值計算,fmax將忽略NaN mimimum,fmin 元素級的最小值計算,fmin將忽略NaN mod 元素級的求模計算(除法的余數(shù)) copysign 將第二個數(shù)組中的值的符號復制給第一個數(shù)組中的值 greater,greater_equal,less,less_equal,equal,not_equal >,>=,<,<=,==,!= logical_and,logical_or,logical_xor &,|,^(即與,或,非)14.利用數(shù)組進行數(shù)據(jù)處理
where的用法
在數(shù)據(jù)分析工作中,where通常用于根據(jù)另一個數(shù)組而產生一個新的數(shù)組。
(1)np.where的第二個和第三個參數(shù)不必是數(shù)組,它們都可以是標量值(即單個數(shù)值)。
(2)傳遞給where的數(shù)組大小可以不相等,甚至可以是標量值
例:設一個由隨機數(shù)據(jù)組成的矩陣,將所有正值規(guī)制為2,將所有負值替換為-2.用where
例2:兩個布爾型cond1和cond2,希望根據(jù)4種不同的布爾值組合實現(xiàn)不同的賦值操作
result=[] for i in range(n):if cond1[i] and cond2[i]:result.append(0)elif cond1[i]:result.append(1)elif cond2[i]:result.append(2)else:result.append(3) # 這個for循環(huán)確實可以改成一個嵌套的where表達式 np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3))) #在上面的例子中,我們還可以利用"布尒值在計算過程中可以被當作0或1處理" result=1*(cond1-cond2)+2*(cond2&-cond1)+3*-(cond1|cond2)15.數(shù)學和統(tǒng)計方法
可以對數(shù)組上的一組數(shù)學函數(shù)對整個數(shù)組或某個軸向的數(shù)據(jù)進行統(tǒng)計計算 ,
如sum,mean(求均值),std(標準差)等聚合計算 .
mean和sum這類的函數(shù)可以接受一個axis參數(shù),用于計算該軸向上的統(tǒng)計值
print arr.mean(axis=1) print arr.sum(0)cumsum和cumprod之類的方法則不聚合,而是產生一個由中間結果組成的數(shù)組
arr=np.array([[0,1,2],[3,4,5],[6,7,8]]) print arr #輸出結果 # [[0 1 2] # [3 4 5] # [6 7 8]] print arr.mean(axis=1) #axis=1是行,每一行求均值 #輸出結果:[ 1. 4. 7.] print arr.mean(axis=0) #axis=0是列,每一列求平均值 #輸出結果:[ 3. 4. 5.] print arr.mean(axis=2) #axis=2報錯,報out of rangeprint arr.cumsum(0) #0是列,即每一列累積和 #輸出結果: # [[ 0 1 2] # [ 3 5 7] # [ 9 12 15]] print arr.cumprod(1) #1是行,即每一行累計積 #輸出結果 # [[ 0 0 0] # [ 3 12 60] # [ 6 42 336]]基本數(shù)組統(tǒng)計方法
sum 對數(shù)組全部或某軸向的元素求和 mean 算術平均數(shù) std,var 標準差和方差 min,max 最大值和最小值 argmin,argmax 分別為最大和最小元素的索引 cumsum 所有元素的累計和 cumprod 所有元素的累計積16.用于布爾型數(shù)組的方法
布爾值會被強制轉換為1(True)和0(False).sum被用來對布爾型數(shù)組中的True值計數(shù).
主要有sum,any,all的方法.
any用于測試數(shù)組中是否存在一個或多個True.
all則檢查數(shù)組中所有值是否都是True.
any,all這兩個方法也能用于非布爾型數(shù)組,所有非0元素將會被當做True.
17.排序、唯一化及Numpy中數(shù)組集合邏輯
#排序 #與python內置的列表類型一樣,Numpuy arr=random.randn(8) print arr print arr.sort()arr=random.randn(5,3) print arr arr.sort(1) print arr唯一化以及其它的集合邏輯
names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe']) print np.unique(names) ints=np.array([3,3,3,2,2,1,1,4,4])print np.unique(ints) #用np.unique等價的純python代碼來對比一下: print sorted(set(names)) #輸出結果如下: ['Bob' 'Joe' 'Will']#np.in1d用于測試一個數(shù)組中的值在另一個數(shù)組中的成員,返回一個布爾型數(shù)組。 values=np.array([6,0,0,3,2,5,6]) print np.in1d(values,[2,3,6]) #輸出結果如下: [ True False False True True False True]Numpy中數(shù)組的集合運算
unique(x) 計算x中的唯一元素,并返回有序結果 intersect1d(x,y) 計算x和y中的公共元素,并返回有序結果 union1d(x,y) 計算x和y的并集,并返回有序結果 in1d(x,y) 得到一個表示“x的元素是否包含于y”的布爾型數(shù)組 setdiff1d(x,y) 集合的差,即元素在x中且不在y中 setxor1d(x,y) 集合的對稱差,即存在于一個數(shù)組中但不同時存在于兩個數(shù)組中的元素18.用于數(shù)組的文件的輸入和輸出
數(shù)組以二進制格式保存到磁盤
(1)np.save和np.load是讀寫磁盤數(shù)組數(shù)據(jù)的兩個主要函數(shù)。np.save是保存即寫入到磁盤,np.load是讀取磁盤上的數(shù)組
(2)np.savez可以將多個數(shù)組保存到一個壓縮文件中,將數(shù)組以關鍵字參數(shù)的形式傳入即可。它的擴展名為.npz
(3)np.loadtxt或者np.genfromtxt將數(shù)據(jù)加載到普通的Numpy數(shù)組中(操作的是txt文件)
(4)np.savetxt是將數(shù)組保存到txt文件中
(5)它是以二進制寫入的,故直接用text打開是亂碼
(6)默認情況下,數(shù)組是以未壓縮的原始二進制格式保存在擴展名為.npy的文件中的。
總結
以上是生活随笔為你收集整理的numpy 相关函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (待补充)【读书笔记】20190816《
- 下一篇: 防抖功能实现