NumPy 學習 第一篇:ndarray 的創建和形狀操縱


NumPy是Python中用於科學計算的基礎軟件包,提供了多維數據組對象,用於對數據進行快速的計算,NumPy包中最核心的類型是ndarray,封裝了python原生的相同數據類型的 n 維數組,定義了一個執行矢量算術運算的n維數組,無需編寫循環結構,就能對整個數組進行批量運算。通常情況下,導入NumPy,設置別名為np。

import numpy as np 

Python原生數組是Array類型,ndarray和原生數組(Array)之間有幾個非常明顯的特征:

  • ndarray對象在創建時有固定的大小,而原生數組對象可以動態增長,更改ndarray的大小將創建一個新數組並刪除原始數組。
  • ndarray對象中的元素類型是相同的,在內存中的大小相同。
  • ndarry有助於對大量數據進行高級數學運算和其他類型的運算。

一,創建ndarray

ndarray是N-Dimension-Array的簡稱,該對象是一個快速而靈活的大數據集容器,該容器中存儲的元素的數據類型都是相同的。

創建數組通常有:

  • 從其他Python結構(例如,列表,元組)轉換
  • numpy原生數組的創建(例如,arange、ones、zeros等)

1,把Python 中array_like對象轉換為Numpy數組

在Python中排列成array-like結構的數值數據可以通過使用array()函數轉換為數組,最明顯的例子是列表和元組。

a1 = np.array([1,2,3,4,5])  #1row
a2 = np.array([[1,2,3,4,5]
         ,[6,7,8,9,10]])# 2row * 5col 

通過array()函數,使用列表創建的是一維數組,使用嵌套的列表創建的是多維數組。

2,創建Numpy原生數組

通過arange()函數創建一維數組,數組的元素是一個序列,默認值start=0,不包括stop,step=1。

numpy.arange([start, ]stop, [step, ]dtype=None)

numpy.arange()的用法示例:

a = np.arange(10) #default start=0, end=10(exclude 10),step=1
# [0 1 2 3 4 5 6 7 8 9]
a1 = np.arange(5,10) # start=5, end=10(exclude=10),step=1
# [5 6 7 8 9]
a2 = np.arange(5,20,2) # start=5, end=20(exclude 20),step=2
#[ 5  7  9 11 13 15 17 19]

可以使用reshape()函數重塑ndarray數組的shape,把12個元素的一維數組轉換為3行4列的二維數組:

>>> np.arange(12).reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

3,數組可以轉換為列表

ndarray對象的tolist()函數可以把一個數組對象轉化為list列表:

>>> np.arange(12).reshape(3,4).tolist()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]

二,ndarray的屬性

數組對象的屬性主要有:

  • dtype:描述數組元素的類型
  • shape:以tuple表示的數組形狀
  • ndim:數組的維度
  • size:數組中元素的個數

1,dtype對象

dtype是一個特殊的對象,它表示數組元素的類型。NumPy定義的跟平台無關的數據類型:

  • 整數有符號系列:np.int8,np.int16,np.int32,np.int64
  • 整數無符號系列:np.uint8、np.uint16、np.uint32、np.uint64
  • 浮點數:np.float32、np.float64
  • 布爾值:np.bool

2,shape對象

以元組形式表示一個數組的維度,前三個維度有名稱:第一個維度是行,第二個維度是列,第三個維度是高

3,ndim對象

數組各個維度的元素數量

4,NumPy的常量

  • np.Inf 表示無窮大
  • np.nan 表示非數字
  • np.pi 

三,NumPy的數據類型

dtype(數據類型)是一個特殊的對象,每一個ndarray對象都有一個dtype,可以通過astype()函數強制轉換數據元素的類型:

>>> arr=np.array([1,2,3])
>>> arr.dtype
dtype('int32')
>>> arr.astype(np.uint8)
array([1, 2, 3], dtype=uint8)

NumPy支持的日期時間類型是:np.datetime64,日期單位是年('Y'),月('M'),周('W')和天('D'), 而時間單位是小時('h'),分鍾('m') ),秒('s'), 毫秒('ms')和一些額外的SI前綴基於秒的單位。 對於“非時間”值,datetime64數據類型還接受字符串“NAT”(不是時間), 以小寫/大寫字母的任意組合。

np.datetime64('2005-02-25')

從字符串創建日期時間數組時,仍然可以通過使用具有通用單位的日期時間類型從輸入中自動選擇單位。

>>> np.array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64')
array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64[D]')

np.arange()函數可以根據時間單位生成時間范圍:

>>> np.arange('2005-02', '2005-03', dtype='datetime64[D]')

NumPy允許兩個Datetime值相減,這個操作產生一個帶有時間單位的數字。timedelta64的參數是一個數字(用於表示單位數),以及日期/時間單位,如 (D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, 或者 (s)econds。timedelta64數據類型也接受字符串“NAT”代替“非時間”值的數字。

>>> numpy.timedelta64(1, 'D')

Datetimes 和 Timedeltas 一起工作,為簡單的日期時間計算提供方法。

>>> np.datetime64('2009-01-01') - np.datetime64('2008-01-01')
numpy.timedelta64(366,'D')
>>> np.datetime64('2009') + np.timedelta64(20, 'D')
numpy.datetime64('2009-01-21')

四,形狀操縱

一個數組的形狀是由每個軸的元素數量決定的,可以通過reshape()和resize()函數來操縱數組的形狀。

1,reshape函數

reshape()函數返回一個給定shape的數組的副本,不會修改原始數組:

numpy.reshape(a, newshape, order='C')

參數 newshape 表示數組的形狀,對於二維數組,newshape是 (row, col) ,第一個維度是行數,第二個維度是列數。

例如,下面的代碼把一個一維數組轉換為4行2列的二位數組:

a=np.arange(8)
np.reshape(a,(4,2))

2,resize函數

resize()函數會修改原始數組,不會返回任何數據,直接對原始數組進行修改:

ndarray.resize(new_shape, refcheck=True)

參數new_shape是元組或n個int數字,表示數組的形狀。

>>> a.resize((2,6))
>>> a
array([[ 2.,  8.,  0.,  6.,  4.,  5.],
       [ 1.,  1.,  8.,  9.,  3.,  6.]])

3,展開數組

ravel()用於返回數組的展開形式,在展開成一維數組時,最右邊的索引“變化最快”。

numpy.ravel(a, order='C')[source]

舉個例子,從行維度和列維度的最小值開始,依次增加,獲取的元素依次排列,構成一維數組:

>>> x = np.array([[1, 2, 3], [4, 5, 6]])
>>> np.ravel(x)
array([1, 2, 3, 4, 5, 6])

四,柵格數據

對於mgrid()函數,用於生成多維數據,參數是一個序列,常用於生成1維,2維和3維數據:

np.mgrid[ 第1維,第2維 ,第3維 , …] 

第n維的書寫形式為:

start:end:step

如果step為整數,表示間隔,左閉右開;如果step為 int + j,表示點數,左閉右閉。

對於np.meshgrid()用於生成網格型數據,接受兩個一維數組生成兩個二維矩陣,對應兩個數組中所有的(x,y)對。

np.meshgrid(x, y)

參考文檔:

Numpy Quickstart tutorial


免責聲明!

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



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