NumPy ndarray


章節


NumPy中最重要的類是ndarray,ndarray是存儲單一數據類型的多維數組。

可以使用索引(從0開始)訪問ndarray對象中的元素。

ndarray的內存結構

標准的Python列表(list)中,元素是對象。如:L = [1, 2, 3],需要3個指針和三個整數對象,對於數值運算比較浪費資源。

與此不同,ndarray中元素直接存儲為原始數據,元素的類型由ndarray對象中的屬性dtype描述。

當ndarray數組中的元素,通過索引或切片返回時,會根據dtype,從原始數據轉換成Python對象,以便外部使用。

ndarray內存結構

上圖中,ndarray頭部信息中的dtype描述了數組元素的數據類型,元素保存為原始數據(二進制數據),從數組中取出后,將根據dtype轉換為相應的python對象。

創建Ndarray對象

要創建ndarray對象,可以使用numpy模塊中的array構造函數。為此,首先需要導入numpy模塊。

>>> a = numpy.array  

示例

[root@qikegu py3]# python
Python 3.7.3 (default, Jun 17 2019, 22:07:41)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> a = numpy.array
>>> print(a)
<built-in function array>

可以將集合對象傳遞給array函數,用於創建與集合對象內容相同的n維數組。語法如下所示:

>>> numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)  

下表是參數說明:

序號 參數 描述
1 object 表示集合對象,可以是列表、元組、字典、集合等等。
2 dtype 可選。可以通過此項參數更改數組元素的類型,默認值是none,表示保持原集合對象中的類型。
3 copy 可選參數。默認是true,表明復制對象。
4 order {‘K’, ‘A’, ‘C’, ‘F’}, 可選參數。指定數組的內存布局,可以是C語言順序(行)或Fortan語言順序(列)。詳情可參考官方文檔。
5 subok 布爾量,可選參數。默認false,表示須返回基類數組;如果設置為true,表示可以返回子類。
6 ndmin 整型,可選。指定返回數組的最小維數。

要使用Python列表創建ndarray數組,使用以下語句:

a = numpy.array([1, 2, 3])  

示例

>>> a = numpy.array([1,2,3])
>>> print(a)
[1 2 3]

要創建多維數組,可使用以下語句。

a = numpy.array([[1, 2, 3], [4, 5, 6]]) 

示例

>>> a = numpy.array([[1, 2, 3], [4, 5, 6]])
>>> print(a)
[[1 2 3]
 [4 5 6]]

要指定數組元素的數據類型,可以傳入dtype參數。

a = numpy.array([1, 3, 5, 7], complex)  

示例

指定數組元素為復數類型:

>>> a = numpy.array([1, 3, 5, 7], complex)
>>> print(a)
[1.+0.j 3.+0.j 5.+0.j 7.+0.j]

獲取數組的維數

ndarray.ndim屬性可以用來獲取數組的維數。

示例

>>> arr = numpy.array([[1, 2, 3, 4], [4, 5, 6, 7], [9, 10, 11, 23]])
>>> print(arr.ndim)
2 

獲取數組元素的大小

ndarray.itemsize屬性用於獲取數組元素的大小,該函數返回數組元素的字節數。

示例

#獲取數組元素的大小  
import numpy as np  
a = np.array([[1,2,3]])  
print("數組元素大小:", a.itemsize, "字節")  

輸出

數組元素大小: 8 字節

獲取數組元素的數據類型

要檢查數組元素的數據類型,可以使用ndarray.dtype屬性。

示例

#檢查數組元素的數據類型
import numpy as np  
a = np.array([[1,2,3]])  
print("數據元素的數據類型是:", a.dtype)  

輸出

數據元素的數據類型是: int64

獲取數組的形狀和大小

要獲得數組的形狀和大小,可以使用ndarray.sizendarray.shape屬性。

數組形狀是指數組的行數和列數,如一個二維數組的形狀是:2(行)x 3(列)

示例

import numpy as np  
a = np.array([[1,2,3,4,5,6,7]])  
print("大小:",a.size)  
print("形狀:",a.shape)  

輸出

大小: 7
形狀: (1, 7)

重構數組對象

數組的形狀指的是多維數組的行數和列數。numpy中,可以改變數組的形狀,即數組的行列排布。

ndarray.reshape()函數可用於重構數組。該函數接受新形狀的行、列兩個參數。

例如,如下圖所示,可以把3x2的數組改為2x3的數組。

reshape

示例

import numpy as np  
a = np.array([[1,2],[3,4],[5,6]])  
print("原數組:")  
print(a)  
a=a.reshape(2,3)  
print("改變后:")  
print(a)

輸出

原數組:
[[1 2]
 [3 4]
 [5 6]]

改變后:
[[1 2 3]
 [4 5 6]]

數組切片

NumPy中,數組切片可以從數組中提取指定范圍的數組元素。NumPy中的數組切片方法與python中的列表切片方法類似。

切片語法

arr_name[start: end: step]
  • [:]表示復制源列表
  • 負的index表示,從后往前。-1表示最后一個元素。

>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> print(a[:5])
[1 2 3 4 5]
>>> print(a[1:5:2])
[2 4]

關於數組切片,后續章節將有詳細介紹。

linspace

linspace()函數的作用是: 返回給定區間內均勻分布的值。下面的示例,在給定的區間5-15內返回10個均勻分布的值

示例

import numpy as np  
a=np.linspace(5,15,10) #打印10個值,這些值在給定的區間5-15上均勻地分布
print(a)  

輸出

[ 5.          6.11111111  7.22222222  8.33333333  9.44444444 10.55555556
 11.66666667 12.77777778 13.88888889 15.        ]

獲取數組元素中的最大值、最小值以及元素的和

ndarray.max()ndarray.min()ndarray.sum()函數,分別用於獲取數組元素中的最大值、最小值以及元素和。

示例

import numpy as np  
a = np.array([1,2,3,10,15,4])  
print("數組:",a)  
print("最大值:",a.max())  
print("最小值:",a.min())  
print("元素總和:",a.sum())   

輸出

數組: [ 1  2  3 10 15  4]
最大值: 15
最小值: 1
元素總和: 35

NumPy數組軸

NumPy多維數組由軸表示,其中axis-0表示列,axis-1表示行。我們可以通過軸對列或行進行計算。例如,求某行元素的和。

NumPy axis

示例

計算每一列中的最大元素、每一行中的最小元素,以及每一行的和:

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
print("數組:",a)  
print("每列的最大元素:",a.max(axis = 0))   
print("每行的最小元素:",a.min(axis = 1))  
print("每行的和:",a.sum(axis = 1))  

輸出

數組: [[ 1  2 30]
 [10 15  4]]
每列的最大元素: [10 15 30]
每行的最小元素: [1 4]
每行的和: [33 29]

求平方根和標准差

NumPy中,sqrt()std()函數分別求數組元素的平方根和標准差。

標准差表示數組的每個元素與numpy數組的平均值之間的差異。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
print(np.sqrt(a))  
print(np.std(a)) 

輸出

[[1.         1.41421356 5.47722558]
 [3.16227766 3.87298335 2.        ]]
10.044346115546242

數組間的算術運算

numpy中,多維數組間可以直接進行算術運算。

在下面的示例中,對兩個多維數組a和b執行算術運算。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
b = np.array([[1,2,3],[12, 19, 29]])  
print("a+b\n",a+b)  
print("axb\n",a*b)  
print("a/b\n",a/b)  

輸出

a+b
 [[ 2  4 33]
 [22 34 33]]
axb
 [[  1   4  90]
 [120 285 116]]
a/b
 [[ 1.          1.         10.        ]
 [ 0.83333333  0.78947368  0.13793103]]

數組拼接

numpy中,可以垂直或水平拼接2個數組。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
b = np.array([[1,2,3],[12, 19, 29]])  
print("垂直拼接\n",np.vstack((a,b)));  
print("水平拼接\n",np.hstack((a,b)))  

輸出

垂直拼接
 [[ 1  2 30]
 [10 15  4]
 [ 1  2  3]
 [12 19 29]]
水平拼接
 [[ 1  2 30  1  2  3]
 [10 15  4 12 19 29]]


免責聲明!

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



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