Python中的數組整合分隔

先學了R,最近剛剛上手python,所以想着將python和R結合起來互相對比來更好理解python。最好就是一句python,對應寫一句R。

python中的numpy模塊相當於R中的matirx矩陣格式,化爲矩陣,很多內容就有矩陣的屬性,可以方便計算。

以下符號:

=R=

代表着在R中代碼是怎麼樣的。

 

   array模塊定義了一種序列數據結構,看起來和list很相似,但是所有成員必須是相同基本類型。

   array-固定類型數據序列array作用是高效管理固定類型數值數據的序列。

   筆者在使用的時候,覺得array十分特別,筆者這樣的新手,感覺有點駕馭不了。

————————————————————————————————————

 

速查手冊:(來源:NumPy 的 Array 介紹)

np.set_printoptions(suppress=True) # 不用科學計數法
 

# 屬性
ndarray.shape: 多維陣列的大小(形狀)
ndarray.ndim: 多維陣列的維度
ndarray.itemsize: 陣列當中元素的大小(佔幾個 byte)
ndarray.nbytes: 整個陣列所有元素的大小總計
ndarray.T: 轉置矩陣,只能在維度 <= 2 的時候使用,與 self.transpose() 效果相同
ndarray.flat: 把陣列扁平化輸出
 
# 格式轉換
ndarray.item: 類似 List 的 Index,把 Array 扁平化取得某 Index 的 value
ndarray.tolist: 把 NumPy.ndarray 輸出成 Python 原生 List 型態
ndarray.itemset: 把 ndarray 中的某個值(純量)改掉
 
# 維度操作
ndarray.reshape(shape): 把同樣的資料以不同的 shape 輸出(array 的 total size 要相同)
ndarray.resize(shape): 重新定義陣列的大小
ndarray.flatten(): 把多維陣列收合成一維陣列(扁平化&Copy)
ndarray.ravel(): 回傳扁平化的陣列(無 Copy)
 
# 項目選擇與操作
ndarray.take(indices): 根據輸入索引值來得到指定陣列
ndarray.put(indices, values): 根據索引值改變陣列 value
ndarray.repeat(times): 重複陣列的值(類似擴張)
ndarray.sort(): 把陣列當中的元素排序
ndarray.sum(): 加總多維陣列(可指定加總的維度根據)
 

 

# 實用模塊
np.squeeze(array)   # 去掉array的第一列
np.maximin(x,0,y)   # 比較兩個值大小,若有小於0的,則爲0
 
 
 

 

 

 

 

 

 

————————————————————————————————————

一、數據生成與複製、重複

1、數列生成

構造單一數列

 

arange(10)  =R=1:10   生成一個連貫的數列
arange(3,7)  =R=3:7
arange(3,10,2)  =R=  seq(3, 9, by = 2)
array(arange(4))  =R= matrix(1:4)
 

生成的過程:

 

np.array([1,2])
   需要np.,筆者在寫的時候,常常用R的思維去寫... 

出錯: array(1,2)  array([1,2])  np.array([1,2],[1,2])

 

類似cut分組

 

 

np.linspace(2.0, 3.0, num=5)   =R= cut(2:3,5)  #類似cut功能,在2,3之間分成5份
 

 

 

matrix矩陣組

 


 
ma=arange(10).reshape(5,2) #matrix(rep(1:10),nrow=5,ncol=2) 按行或列生成一定規則的 ones((2,3), dtype=int) =R= matrix(rep(1,6),2,3) #矩陣內元素都爲1 random.random((2,3)) =R= matrix(runif(6),2,3) #生成隨機數 

 

 
構造空白數組:
    ones創建全1矩陣 
    zeros創建全0矩陣 
    eye創建單位矩陣 
    empty創建空矩陣(實際有值)

 
import numpy as np a_ones = np.ones((3,4)) # 創建3*4的全1矩陣 print(a_ones) # 結果 [[ 1. 1. 1. 1.] [ 1. 1. 1. 1.] [ 1. 1. 1. 1.]] a_zeros = np.zeros((3,4)) # 創建3*4的全0矩陣 print(a_zeros) # 結果 [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]] a_eye = np.eye(3) # 創建3階單位矩陣 print(a_eye) # 結果 [ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] a_empty = np.empty((3,4)) # 創建3*4的空矩陣 print(a_empty) # 結果 [[ 1.78006111e-306 -3.13259416e-294 4.71524461e-309 1.94927842e+289] [ 2.10230387e-309 5.42870216e+294 6.73606381e-310 3.82265219e-297] [ 6.24242356e-309 1.07034394e-296 2.12687797e+183 6.88703165e-315]]
 

 

等差、等比數列
 

 

linspace()和matlab的linspace很類似,用於創建指定數量等間隔的序列,實際生成一個等差數列。

 
import numpy as np a = np.linspace(0,10,7) # 生成首位是0,末位是10,含7個數的等差數列 print(a) # 結果 [ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333 10. ]
 


linspace用於生成等差數列,而logspace用於生成等比數列。 
下面的例子用於生成首位是100,末位是102,含5個數的等比數列。

 

 


 
 


 
import numpy as np a = np.logspace(0,2,5) print(a) # 結果 [ 1. 3.16227766 10. 31.6227766 100. ]
 

 


 
 

 

2、複製/重複repeat、title

 

貌似是list/tuple/dict唯一一個擁有重複屬性的吧? 兩個重複函數:repeat/tile

 

repeat函數功能:對數組中的元素進行連續重複複製

用法有兩種:

1) numpy.repeat(a, repeats, axis=None)

2) a.repeats(repeats, axis=None)

>>>import numpy as np
 
>>> a = np.arange(10)  
 
>>> a  
 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  
 
>>> a.repeat(5)  
 
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4,  
 
        4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9,  
 
        9, 9, 9, 9])  
 
>>> a
 
np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  #a數組的內容沒改變
 

 

tile函數功能:對整個數組進行復制拼接

用法:numpy.tile(a, reps)

其中a爲數組,reps爲重複的次數

 

>>> np.tile(a,2)  
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  
>>> a
np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  
 
>>> a=np.array([10,20])
>>>a
array([10,20])
>>>np.tile(a, (3,2)) #構造3*2個copy
array([[10, 20, 10, 20],  
          [10, 20, 10, 20],  
          [10, 20, 10, 20]])  
 
 


——————————————————————————————————————————————————

 

二、array屬性與統計、運算

1、矩陣屬性

 


 
ma.shape #輸出5,2(矩陣橫縱維度) ma.ndim =R=dim(ma) #維度,dim(data) ma.size #元素總數,5*2
 

 


 
 

 

In [26]: arr3.dtype #dtype方法返回數組的數據類型 Out[26]: dtype('int32')

 
缺失值填補:

 
example = np.where(np.isnan(example), 0, example) example = np.where(np.isnan(example), 0, example)
 

 

 

2、數組拉直

 

 

 

拉直的辦法有兩個:arr3.ravel()  和  arr3.flatten()

第一種辦法:

 

a = arr3.ravel()    #通過ravel的方法將數組拉直(多維數組降爲一維數組)
 

In [24]: arr3
Out[24]:
array([[  1,   1,   2,   3],
[  5,   8,  13,  21],
[ 34,  55,  89, 144]])

第二種辦法:

 

 

In [29]: b = arr3.flatten()  #通過flatten的方法將數組拉直
In [30]: b
Out[30]: array([  1,   1,   2,   3,   5,   8,  13,  21,  34,  55,  89, 144])
 

 

 

兩者的區別在於ravel方法生成的是原數組的視圖,無需佔有內存空間,但視圖的改變會影響到原數組的變化。而flatten方法返回的是真實值,其值的改變並不會影響原數組的更改。

通過下面的例子也許就能明白了:

In [31]: b[:3] = 0
In [32]: arr3
Out[32]:
array([[  1,   1,   2,   3],
[  5,   8,  13,  21],
[ 34,  55,  89, 144]])

通過更改b的值,原數組沒有變化。

 

 


 
 

 


 
3、矩陣運算——相乘、求積

 


 
(arange(4).reshape(2,2))* (arange(8).reshape(2,2)) #組內數字相乘 dot( (arange(4).reshape(2,2)),(array([[1,2],[3,5]]))) #矩陣相乘 ma*=2 #ma=ma*2,會原地的改變數組而不是創建一個新的數組 
所有元素之積:

 

prod() 
得到數組所有元素之積,是個數字。也可以aaa.sum(axis),分別求每一行或者是每一列的元素之積

累計積:cumprod() 

 

all() :如果所有元素爲真,返回真;否則返回假 

特徵值 :linalg.eigvals() 

返回A的特徵值 


 

 

 

 

 
4、矩陣運用函數——加總、求均值、累積和、極大值、極小值

ma.sum()
ma.min()
ma.max()
ma.sum(axis=0)  =R=apply(b,1,sum)  =R=colSums(data)      #axis=0代表縱向,列;axis=1,代表橫向
ma.cumsum(axis=1)                       #按行,累計加總的結果

 
(1)求和:
ma.sum/min代表所有元素加總.
其中,如果是矩陣連加,有兩種方式:array+array=矩陣,array.sum()=數值

    第一種就是mat + mat,用加號,生成的還是矩陣,高緯度;
    第二種就是sum(mat),用sum,一維單個數值.
同時注意,跟ma.sum()不一樣,.sum()返回的是一個矩陣總和。

 

 
場景一:矩陣相加-均值

 

data_array + data_array - data_array.mean()

場景二:矩陣小於某閾值的,賦值

 

 

data.array[data.array< 0 ] = 0
 

 

矩陣小於0的,都設置爲0

 

 

 

場景三:矩陣變一維向量:ravel()

 

data.array.ravel()
 

(2)求平均:

獲得矩陣中元素的平均值可以通過函數mean()。同樣地,可以獲得整個矩陣、行或列的平均值。

 

import numpy as np
 
a = np.array([[1,2,3],[4,5,6]])
print(a.mean()) #結果爲: 3.5
 
# 同樣地,可以通過關鍵字axis參數指定沿哪個方向獲取平均值
print(a.mean(axis=0)) # 結果 [ 2.5  3.5  4.5]
print(a.mean(axis=1)) # 結果 [ 2.  5.]
 

(3)進行正弦計算:

 

 >>> y = np.sin(x)
 >>> y
 array([  0.00000000e+00,   6.42787610e-01,   9.84807753e-01,
          8.66025404e-01,   3.42020143e-01,  -3.42020143e-01,
         -8.66025404e-01,  -9.84807753e-01,  -6.42787610e-01,
         -2.44921271e-16])
 

 

矩陣函數    說明
np.sin(a)    對矩陣a中每個元素取正弦,sin(x)
np.cos(a)    對矩陣a中每個元素取餘弦,cos(x)
np.tan(a)    對矩陣a中每個元素取正切,tan(x)
np.arcsin(a)    對矩陣a中每個元素取反正弦,arcsin(x)
np.arccos(a)    對矩陣a中每個元素取反餘弦,arccos(x)
np.arctan(a)    對矩陣a中每個元素取反正切,arctan(x)
np.exp(a)    對矩陣a中每個元素取指數函數,ex
np.sqrt(a)    對矩陣a中每個元素開根號√x
 

 

(4)累計和:

 

 

 

 

 

aaa.cumsum()
2 結果爲:array([ 10,  19,  27,  34,  40,  45,  87, 120, 122])
 

 

(5)求最大值,最小值:

獲得矩陣中元素最大最小值的函數分別是max和min,可以獲得整個矩陣、行或列的最大最小值。 
例如

 

import numpy as np
 
a = np.array([[1,2,3],[4,5,6]])
print(a.max()) #獲取整個矩陣的最大值 結果: 6
print(a.min()) #結果:1
 
# 可以指定關鍵字參數axis來獲得行最大(小)值或列最大(小)值
# axis=0 行方向最大(小)值,即獲得每列的最大(小)值
# axis=1 列方向最大(小)值,即獲得每行的最大(小)值
# 例如
 
print(a.max(axis=0))
# 結果爲 [4 5 6]
 
print(a.max(axis=1))
# 結果爲 [3 6]
 
# 要想獲得最大最小值元素所在的位置,可以通過argmax函數來獲得
print(a.argmax(axis=1))
# 結果爲 [2 2]
 

(6)求方差與標準差

方差:比較簡單,分別是np.sum(), np.mean(), np.var(), np.std()(這個是標準差),關鍵是在加入axis參數以後要很好的區分

 

>>> a
array([[6, 7, 1, 6],
       [1, 0, 2, 3],
       [7, 8, 2, 1]])
方差:
>>> np.var(a)
7.7222222222222223
>>> np.var(a,axis=0)
array([  6.88888889,  12.66666667,   0.22222222,   4.22222222])
>>> np.std(a,axis=0)
array([ 2.62466929,  3.55902608,  0.47140452,  2.05480467])
 


5、偏度、峯度

 

參考:Python統計學一數據的概括性度量、《Python數據分析基礎教程:Numpy學習指南》- 速記 - 第十章

 

在scipy模塊中

偏度(skewness)、描述的是概率分佈的偏斜(非對稱)程度。偏度檢驗有兩個返回值,其中第二個返回值爲p-value,即觀察到的數據集服從正態分佈的概率,取值範圍爲0~1

峯度(kurtosis)描述的是概率分佈曲線的陡峭程度。

 

偏態係數:偏度(Skewness)亦稱偏態、偏態係數,偏度是統計數據分佈偏斜方向和程度的度量,是統計數據分佈非對稱程度的數字特徵。Sk>0時,分佈呈正偏態(右偏),Sk<0時,分佈呈負偏態(左偏)。
峯態係數:(Kurtosis)峯度係數是用來反映頻數分佈曲線頂端尖峭或扁平程度的指標。在正態分佈情況下,峯度係數值是3。>3的峯度係數說明觀察量更集中,有比正態分佈更短的尾部;<3的峯度係數說明觀測量不那麼集中,有比正態分佈更長的尾部,類似於矩形的均勻分佈。峯度係數的標準誤用來判斷分佈的正態性。峯度係數與其標準誤的比值用來檢驗正態性。如果該比值絕對值大於2,將拒絕正態性。
 

 

from scipy import stats
import matplotlib.pyplot as plt
 
generated = stats.norm.rvs(size=900)  #使用scipy.stats包按正態分佈生成隨機數。
print "Mean", "Std", stats.norm.fit(generated)  #用正態分佈去擬合生成的數據,得到其均值和標準差。
 
#偏度(skewness)描述的是概率分佈的偏斜(非對稱)程度。偏度檢驗有兩個返回值,其中第二個返回值爲p-value,即觀察到的數據集服從正態分佈的概率,取值範圍爲0~1。
print "Skewtest", "pvalue", stats.skewtest(generated) 
 
#output
#Skewtest pvalue (-0.62120640688766893, 0.5344638245033837) 
#該數據集有53%的概率服從正態分佈。
 
#峯度(kurtosis)描述的是概率分佈曲線的陡峭程度。
print "Kurtosistest","pvalue",stats.kurtosistest(generated)
 
#正態性檢驗(normality test)可以檢查數據集服從正態分佈的程度。我們來做一個正態性檢驗。該檢驗同樣有兩個返回值,其中第二個返回值爲p-value。
print "Normaltest", "pvalue", stats.normaltest(generated)
 
#得到95%處的數值如下
print "95 percentile", stats.scoreatpercentile(generated, 95)
 
#將前一步反過來,可以從數值1出發找到對應的百分比
print "Percentile at 1", stats.percentileofscore(generated, 1)
 

6、numpy的除法

很多情況會遇到,1/2=0的情況,所以需要了解一下。

精確除法

除法總是會返回真實的商,不管操作數是整形還是浮點型。執行from __future__ import division 指令就可以做到這一點。

 

>>>from __future__ import division  
>>>1/2  
0.5  
>>>1//2 0 >>>1.0//2 0 >>>-1//2.0 -1 

>>>1.0/2.0 0.5
地板除

 

 

 

 

 

 

從Python2.2開始,增加了一個操作符 // ,以執行地板除://除法不管操作數爲何種數值類型,總是會捨去小數部分,返回數字序列中比真正的商小的最接近的數字。

 

>>>1//2  
0  
>>>1.0//2  
0  
>>>-1//2.0  
-1  
 

 

 

傳統除法

如果是整數除法則執行地板除,如果是浮點數除法則執行精確除法。

>>>1/2  
0  
>>>1.0/2.0  
0.5  
 

7、白化(Whitening)

來源於:訓練深度神經網絡的必知技巧,你知道哪些?

白化相當於在零均值化和歸一化操作之間插入一個旋轉操作,將數據投影到主軸上。一張圖片經過白化後,可以認爲每個像素之間是統計獨立的。然而白化很少在卷積神經網絡中使用,可能原因是圖像信息本來就是依靠像素之間的相對差異來體現的,白化讓像素間去相關,讓這種差異變得不確定,損失了信息。

將數據零均值化,再計算協方差矩陣(convariance matrix)來觀察數據中的相關結構。

 

X-=np.mean(X,axis=0)
 
cov=np.dot(X.T,X)/X.shape[0] #計算協方差矩陣

然後做去相關操作, 即通過將原始數據(零均值化後的數據)投影到特徵基空間(eigenbasis)。

 

 

U,S,V=np.linalg.svd(cov) #計算數據協方差矩陣的奇異值分解(SVDfactorization)
 
Xrot=np.dot(X,U) #對數據去相關
 

 

最後一步變換是白化,即把特徵基空間的數據除以每個維度的特徵值來標準化尺度。

 

Xwhite=Xrot/np.sqrt(S+1e-5) #除以奇異值的平方根,注意到這裏加了個 1e-5 是爲了防止分母是 0 的情況。
PCA 白化的一個缺點是會增加數據中的噪聲,因爲它把輸入數據的所有維度都延伸到相同的大小,這些維度中就包含噪音維度(往往表現爲不相關的且方差較小)。這種缺點在實際操作中可以通過把 1e-5 增大到一個更大的值來引入更強的平滑。

 

 

 

 

 

 

——————————————————————————————————————————

 

 

 

三、numpy如何導出以及導入、數列格式轉換

1、numpy如何導出、導入

參考:Python Numpy數組保存

 

  Numpy提供了幾種數據保存的方法。

   以3*4數組a爲例:

 

    1. a.tofile("filename.bin")

      這種方法只能保存爲二進制文件,且不能保存當前數據的行列信息,文件後綴不一定非要是bin,也可以爲txt,但不影響保存格式,都是二進制。

      這種保存方法對數據讀取有要求,需要手動指定讀出來的數據的的dtype,如果指定的格式與保存時的不一致,則讀出來的就是錯誤的數據。

       b = numpy.fromfile("filename.bin",dtype = **)

       讀出來的數據是一維數組,需要利用

        b.shape = 3,4重新指定維數。

 

    2.numpy.save("filename.npy",a)

       利用這種方法,保存文件的後綴名字一定會被置爲.npy,這種格式最好只用

       numpy.load("filename")來讀取。

 

   3.numpy.savetxt("filename.txt",a)

      b =  numpy.loadtxt("filename.txt")

     用於處理一維和二維數組

 

2、數組格式轉換

 

 

 

數組轉換:tolist將數組轉換爲列表,astype()強制轉換數組的數據類型,下面是兩個函數的例子:

 

In [53]: b = a.tolist()
In [54]: b
Out[54]:
[[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]
In [55]: type(b)
Out[55]: list
 
In [56]: c = a.astype(float)
In [57]: c
Out[57]:
array([[  0.,   1.,   2.,   3.],
[  4.,   5.,   6.,   7.],
[  8.,   9.,  10.,  11.],
[ 12.,  13.,  14.,  15.],
[ 16.,  17.,  18.,  19.],
[ 20.,  21.,  22.,  23.]])
 
In [58]: a.dtype
Out[58]: dtype('int32')
In [59]: c.dtype
Out[59]: dtype('float64')
 

這裏有一個非常實際的問題:

 

一般結果輸出都是array格式,然後我要加一個字符串形式進行,總不能.append的加,所以需要把array轉化格式。譬如有一個名稱爲a的array格式數據。

 

['a1.jpg',]  +  a.tolist()
其中,[]中間有一個",",這個很有意思,如果你不加就是單純的字符格式,需要加一個逗號,才能識別爲[]  

 

 

 

其他格式轉化:

 

1. list轉化爲numpy.ndarray:

np.array(example)

2. numpy.ndarray轉化爲list:

list(example)

3. numpy.ndarray轉化爲dataframe:

pd.DataFrame(example)

4. dataframe轉化爲numpy.ndarray:

example.values[:, :]

 

 

————————————————————————————————————————————————————

 

  四、array添加數據、切片、合併

 

1、array添加數據

 

a=[]
 
#append
a.append([1,2])
 
#insert
a.insert(2,1)
a.insert(2,[1,2])
 

   append加在後面,insert(位置,內容)可以加在指定位置。這邊筆者又要吐槽自己了...以爲又在使用R,如果a是array格式的,append是不可以使用的。只有a=[]元組的時候,纔可以append加進去。

 

   注意append用法:其中append用在list之中,在DataFrame/array無法使用

 

 

  2、切片過程:

 

>>>Array[0:]  ——>切片從前面序號“0”開始到結尾,包括“0”位
  [2, 3, 9, 1, 4, 7, 6, 8]
 
  >>>Array[:-1]  ——>切片從後面序號“-1”到最前,不包括“-1”位
  [2, 3, 9, 1, 4, 7, 6]
 
  >>>Array[3:-2]  ——>切從前面序號“3”開始(包括)到從後面序號“-2”結束(不包括)
  [1, 4, 7]
 
  >>>Array[3::2]  ——>從前面序號“3”(包括)到最後,其中分隔爲“2”
  [1, 7, 8]
 

3、numpy對象縱向合併

 

用numpy中的concatenation函數進行合併。

 

 

4、用邏輯符bool定位出numpy中的內容

 

vector = numpy.array([5, 10, 15, 20])
print(vector)
[ 5 10 15 20]
equal_to_ten = (vector == 10)
print(equal_to_ten)
[False  True False False]
# 輸出只有相對於位布爾值是True位置上的值
print(vector[equal_to_ten])
[10]
 

 

 

 

 

5、橫向拼接

 

 

In [40]: arr3
Out[40]:
array([[  0,   0,   0,   3],
[  5,   8,  13,  21],
[ 34,  55,  89, 144]])
 
In [41]: arr4
Out[41]:
array([[ 1,  2,  3,  4],
[ 5,  6,  7,  8],
[ 9, 10, 11, 12]])
 
In [42]: np.hstack((arr3,arr4))
Out[42]:
array([[  0,   0,   0,   3,   1,   2,   3,   4],
[  5,   8,  13,  21,   5,   6,   7,   8],
[ 34,  55,  89, 144,   9,  10,  11,  12]])

橫向拼接arr3和arr4兩個數組,但必須滿足兩個數組的行數相同。

 

 

 

 

In [43]: np.vstack((arr3,arr4))  
Out[43]:
array([[  0,   0,   0,   3],
[  5,   8,  13,  21],
[ 34,  55,  89, 144],
[  1,   2,   3,   4],
[  5,   6,   7,   8],
[  9,  10,  11,  12]])
 

縱向拼接arr3和arr4兩個數組,但必須滿足兩個數組的列數相同。

 

In [44]: np.column_stack((arr3,arr4))    #與hstack函數具有一樣的效果
Out[44]:
array([[  0,   0,   0,   3,   1,   2,   3,   4],
[  5,   8,  13,  21,   5,   6,   7,   8],
[ 34,  55,  89, 144,   9,  10,  11,  12]])
 
In [45]: np.row_stack((arr3,arr4))    #與vstack函數具有一樣的效果
Out[45]:
array([[  0,   0,   0,   3],
[  5,   8,  13,  21],
[ 34,  55,  89, 144],
[  1,   2,   3,   4],
[  5,   6,   7,   8],
[  9,  10,  11,  12]])
 

 

 

 

————————————————————————————————————————

 

延展一:range的用法

 

   一開始還是R的思維以爲[1:2]就可以得到一個序列,python裏面不是,需要range,有點像R裏面的rep

   range(0,2) =R= [1,2]

   range(0,10,2) 0-9每隔2個取數一次

 

xrange 用法與 range 完全相同,所不同的是生成的不是一個list對象,而是一個生成器。

 

>>> xrange(5)
 
xrange(5)
 
>>> list(xrange(5))
 
[0, 1, 2, 3, 4]
 
>>> xrange(1,5)
 
xrange(1, 5)
 
>>> list(xrange(1,5))
 
[1, 2, 3, 4]
 
>>> xrange(0,6,2)
 
xrange(0, 6, 2)
 
>>> list(xrange(0,6,2))
[0, 2, 4]
參考:Python xrange與range的區別

 

————————————————————————————————————————

 

延伸二:高緯度array表示[0,0,0,0]

 

一個array有四個維度:[1,1024,19,19],代表的意思是,有1024個19*19矩陣,如果要抽取其中一個19*19的矩陣,則表示爲:

[0,1,:,:]

 

————————————————————————————————————————

 

延伸三:array中數據的替換

ndarray.itemset: 把 ndarray 中的某個值(純量)改掉,使用範例如下:

 

>>> x = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]], np.int32)
>>> x
array([[[ 1,  2,  3],
            [ 4,  5,  6]],
 
        [[ 7,  8,  9],
            [10, 11, 12]]], dtype=int32)
# 把 index = 1 的 value 改成 999
>>> x.itemset(1, 999)
>>> x
array([[[  1, 999,   3],
        [  4,   5,   6]],
 
        [[  7,   8,   9],
        [ 10,  11,  12]]], dtype=int32)
# 把 index = (1, 1, 2) 的值改成 888
>>> x.itemset((1, 1, 2), 888)
>>> x
array([[[  1, 999,   3],
            [  4,   5,   6]],
 
        [[  7,   8,   9],
            [ 10,  11, 888]]], dtype=int32)
--------------------- 
作者:悟乙己 
來源:CSDN 
原文:https://blog.csdn.net/sinat_26917383/article/details/52290505 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

已知reshape函數可以有一維數組形成多維數組
ravel函數可以展平數組
b.ravel()
flatten()函數也可以實現同樣的功能
區別:ravel只提供視圖view,而flatten分配內存存儲

重塑:

用元祖設置維度
>>> b.shape=(4,2,3)
>>> b
array([[ 0, 1, 2],
        [ 3, 4, 5],

       [ 6, 7, 8],
        [ 9, 10, 11],

       [12, 13, 14],
        [15, 16, 17],

       [18, 19, 20],
        [21, 22, 23]])

轉置:
>>> b
array([0, 1],
       [2, 3])
>>> b.transpose()
array([0, 2],
       [1, 3])

=============數組的組合==============
>>> a
array([0, 1, 2],
       [3, 4, 5],
       [6, 7, 8])
>>> b = a*2
>>> b
array([ 0, 2, 4],
       [ 6, 8, 10],
       [12, 14, 16])

1.水平組合
>>> np.hstack((a,b))
array([ 0, 1, 2, 0, 2, 4],
       [ 3, 4, 5, 6, 8, 10],
       [ 6, 7, 8, 12, 14, 16])
>>> np.concatenate((a,b),axis=1)
array([ 0, 1, 2, 0, 2, 4],
       [ 3, 4, 5, 6, 8, 10],
       [ 6, 7, 8, 12, 14, 16])

2.垂直組合
>>> np.vstack((a,b))
array([ 0, 1, 2],
       [ 3, 4, 5],
       [ 6, 7, 8],
       [ 0, 2, 4],
       [ 6, 8, 10],
       [12, 14, 16])
>>> np.concatenate((a,b),axis=0)
array([ 0, 1, 2],
       [ 3, 4, 5],
       [ 6, 7, 8],
       [ 0, 2, 4],
       [ 6, 8, 10],
       [12, 14, 16])

3.深度組合:沿着縱軸方向組合
>>> np.dstack((a,b))
array([[ 0, 0],
        [ 1, 2],
        [ 2, 4],

       [ 3, 6],
        [ 4, 8],
        [ 5, 10],

       [ 6, 12],
        [ 7, 14],
        [ 8, 16]])

4.列組合column_stack()
一維數組:按列方向組合
二維數組:同hstack一樣

5.行組合row_stack()
以爲數組:按行方向組合
二維數組:和vstack一樣

6.==用來比較兩個數組
>>> a==b
array([ True, False, False],
       [False, False, False],
       [False, False, False], dtype=bool)
#True那個因爲都是0啊

==================數組的分割===============
>>> a
array([0, 1, 2],
       [3, 4, 5],
       [6, 7, 8])
>>> b = a*2
>>> b
array([ 0, 2, 4],
       [ 6, 8, 10],
       [12, 14, 16])

1.水平分割(難道不是垂直分割???)
>>> np.hsplit(a,3)
[array([0],
       [3],
       [6]),
 array([1],
       [4],
       [7]), 
array([2],
       [5],
       [8])]
split(a,3,axis=1)同理達到目的

2.垂直分割
>>> np.vsplit(a,3)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

split(a,3,axis=0)同理達到目的

3.深度分割
某三維數組:::
>>> d = np.arange(27).reshape(3,3,3)
>>> d
array([[ 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]])

深度分割後(即按照深度的方向分割)
注意:dsplite只對3維以上數組起作用
raise ValueError('dsplit only works on arrays of 3 or more dimensions')
ValueError: dsplit only works on arrays of 3 or more dimensions

>>> np.dsplit(d,3)
[array([[ 0],
        [ 3],
        [ 6],

       [ 9],
        [12],
        [15],

       [18],
        [21],
        [24]]), array([[ 1],
        [ 4],
        [ 7],

       [10],
        [13],
        [16],

       [19],
        [22],
        [25]]), array([[ 2],
        [ 5],
        [ 8],

       [11],
        [14],
        [17],

       [20],
        [23],
        [26]])]

===================數組的屬性=================
>>> a.shape #數組維度
(3, 3)
>>> a.dtype #元素類型
dtype('int32')
>>> a.size #數組元素個數
9
>>> a.itemsize #元素佔用字節數
4
>>> a.nbytes #整個數組佔用存儲空間=itemsize*size
36
>>> a.T #轉置=transpose
array([0, 3, 6],
       [1, 4, 7],
       [2, 5, 8])

 

 

選取某一行的數據:pandas DataFrame

選擇DataFrame裏面某一列等於某個值的所有行,用一條命令即可解決即:

df.loc[df['columnName']=='the value']

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章