python numpy數組操作


數組的創建

import numpy as np

arr1 = np.array([3,10,8,7,34,11,28,72])

arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),

        (3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))

print('一維數組:  \n',arr1)

print('二維數組:  \n',arr2)

如上述所示,可以將列表和元組轉換為一個數組,在第二個數組中,輸入的元素含有整數型和浮點型兩種數據類型,但輸出的數組

元素全部是浮點型(原來的整型被強制轉換為浮點型了,保證數組元素的一致性)

 

數組元素的獲取

import numpy as np
arr1 = np.array([3,10,8,7,34,11,28,72])
arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),
(3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
print('一維數組: \n',arr1)
print('二維數組: \n',arr2)
print(arr1[[2,3,5,7]])               #數組1的3 4 6 8個元素
print(arr2[1,2])        #二維數組的第2行第3列的元素   輸出的是具體的數值
print(arr2[2,:])        #二維數組的第3行所有數據    
print(arr2[:,1])        #二維數組的第2列所有數組
print(arr2[1:4,1:5])      #二維數組的第2-4行,2-5列的數據   這個地方要注意的,不是分別顯示2行5列和2行6列的數據

print(arr2[[0,1],[2,3]])           #對比一下上面的表達,這個表達要比較注意,表示的是 0 2 第1行第3列的數據,和 1 3第2行第4列的數據輸                                                #出的是 [4.1,7.3] 組成的一維數組  

print(arr2[np.ix_([0,-1],[1,3])])   #第1行第2列,第1行第4列 ;最后一行第2列,最后一行第4列  組成的二維數組  

print(arr2[np.ix_([0,-1],[1,2,3])])  #第1行第2列,第1行第3列,第1行第4列;最后一行第2列,最后一行第3列,最后一行第4列 組成的二維                                                       #數組

out:
[[ 6. 4.1 2. ] [13.4 15.6 17.8]]

數組的常用屬性

    如果不是手工寫入的數組,而是從外部讀入的數據,此時也許對數據就是一無所知,如該數據的維數,行列數,數據類型等信息,下面通過簡短的代碼來了解數組的幾個常用屬性,進而跨出了解數據的第一步。

     在numpy模塊中,可以通過genfromtxt函數讀取外部文文件的數據,這里的文本文件主要為csv文件和txt文件。關於該函數的語法和重要參數含義如下:

np.genfrom xt(fname,dtype=<class 'float' >,

comments = '#',delimiter = None,skip_header = 0,

skip_footer=0,converters=None,missing

_values=None,filling_values=None,usecols=None,

names=None.)

fname:指定需要讀入數據的文件路徑。

dtype:指定讀入數據的數據類型,默認為浮點型,如果原數據集中含有字符型數據,必須指定數據類型為“str”

comments:指定注釋符,默認為“#”,如果原數據的行首有“#”,將忽略這些行的讀入。

delimiter:指定數據集的列分割符

skip_footer:是否跳過數據集的腳注,默認不跳過

converters:將指定列的數據轉換成其他數值。

miss_values:指定缺失值的標記,如果原數據集含指定的標記,讀入后這樣的數據就為缺失值。

filling_values:指定缺失值的填充值。

usecols:指定需要讀入哪些列。

names:為讀入數據的列設置列名稱。

例:

import numpy as np
stu_score = np.genfromtxt(fname = r'D:\BaiduNetdiskDownload\從零開始學Python--數據分析與挖掘\第4章 Python數值計算工具--Numpy\stu_score.txt',
delimiter='\t',skip_header=1)
print(type(stu_score))        #查看數據結構
print(stu_score.ndim)        #查看數據維數
print(stu_score.shape)      #查看數據行列數
print(stu_score.dtype)       #查看數組元的數據類型
print(stu_score.size)          #查看數組元素的個數

 out:

<class 'numpy.ndarray'>
2
(1380, 5)
float64
6900

 

數組的形狀處理

    數組形狀處理的手段主要有reshape,resize,ravel,flatten,vstack,hstack,row_stack和colum_stack,下面通過簡單的案例

來解釋這些‘方法’或函數的區別。

 

arr3 = np.array([[1,5,7],[3,6,1],[2,4,8],[5,8,9],[1,5,9],[8,5,2]])

print(arr3.shape)              #操作前數組的行列數
print(arr3.reshape(2,9))    #使用reshpe方法更改數組的形狀
print(arr3.shape)          #確認一下原數組的形狀有沒有被改變

print(arr3.resize(2,9))       #使用resize方法改變數組的形狀
print(arr3.shape)    

out:

(6, 3)
[[1 5 7 3 6 1 2 4 8]
 [5 8 9 1 5 9 8 5 2]]
(6, 3)
None
(2, 9)

因此得出:reshape方法不改變原有數組的形狀,resize方法改變了原有數組的形狀;實際上reshape方法只是返回改變形狀后的預覽,而resize方法不返回預覽,會直接改變數組的形狀。

 如果需要將多維數組降為一維數組,利用ravel,flatten和reshape三種方法均可以輕松解決。

例:

import numpy as np
arr4 = np.array([[1,10,100],[2,20,200],[3,30,300]])
print('原數組:\n',arr4)
#默認排序降維
print('數組維度:\n',arr4.ravel())
print(arr4.flatten())
print(arr4.reshape(-1))
#改變排序模式的降維
print(arr4.ravel(order = 'F'))
print(arr4.flatten(order = 'F'))
print(arr4.reshape(-1,order = 'F'))

 out:

原數組:
 [[  1  10 100]
 [  2  20 200]
 [  3  30 300]]
數組維度:
 [  1  10 100   2  20 200   3  30 300]
[  1  10 100   2  20 200   3  30 300]
[  1  10 100   2  20 200   3  30 300]
[  1   2   3  10  20  30 100 200 300]
[  1   2   3  10  20  30 100 200 300]
[  1   2   3  10  20  30 100 200 300]

import numpy as np
arr4.flatten()[0] = 2000
print('flatten方法:\n',arr4)
arr4.ravel()[1] = 1000
print('ravel方法:\n',arr4)
arr4.reshape(-1)[2] = 3000
print('reshape 方法:\n',arr4)

 out:

flatten方法:
 [[  1  10 100]
 [  2  20 200]
 [  3  30 300]]
ravel方法:
 [[   1 1000  100]
 [   2   20  200]
 [   3   30  300]]
reshape 方法:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]]

如上結果所示,通過flatten方法實現的降維返回的是復制,因為對降維后的元素做修改,並沒有影響到原數組arr4的結果;相反,ravel方法與reshape方法返回的則是視圖,通過對視圖的改變,是會影響到原數組arr4的.

vastack用於垂直方向(縱向)的數組堆疊,其功能與row_stack函數一致,而hstack則用於水平方向(橫向)的數組合並,其功能與colum_stack函數一致,下面通過例子說明差異:

import numpy as np
arr5 = np.array([1,2,3])
print('vstack縱向堆疊數組:\n',np.vstack([arr4,arr5]))
print('row_stack縱向堆疊數組:\n',np.row_stack([arr4,arr5]))
arr6 = np.array([[5],[15],[25]])
print('hstack橫向合並數組:\n',np.hstack([arr4,arr6]))
print('column_stack橫向合並數組:\n',np.column_stack([arr4,arr6]))

 

out:

vstack縱向堆疊數組:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]
 [   1    2    3]]
row_stack縱向堆疊數組:
 [[   1 1000 3000]
 [   2   20  200]
 [   3   30  300]
 [   1    2    3]]
hstack橫向合並數組:
 [[   1 1000 3000    5]
 [   2   20  200   15]
 [   3   30  300   25]]
column_stack橫向合並數組:
 [[   1 1000 3000    5]
 [   2   20  200   15]
 [   3   30  300   25]]

如上結果所示,前兩個輸出是縱向堆疊的效果,后兩個則是橫向合並的效果.如果是多個數組的縱向堆疊,必須保證每個數組的列數相同.如果將多個數組按橫向合並的話,則必須保證每個數組的行數相同.

 

 

 

 

 





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM