首頁 > 軟體

Python NumPy教學之陣列的基本操作詳解

2022-08-25 18:01:13

Numpy中的N維陣列(ndarray)

Numpy 中的陣列是一個元素表(通常是數位),所有元素型別相同,由正整數元組索引。在 Numpy 中,陣列的維數稱為陣列的秩。給出陣列沿每個維的大小的整數元組稱為陣列的形狀。Numpy 中的陣列類稱為ndarray。Numpy 陣列中的元素可以使用方括號存取,並且可以使用巢狀的 Python 列表進行初始化。

例子 :

[[ 1, 2, 3],
      [ 4, 2, 5]]

Here, rank = 2 (as it is 2-dimensional or it has 2 axes)
First dimension(axis) length = 2, second dimension has length = 3
overall shape can be expressed as: (2, 3)
# 演示基本陣列特徵的 Python 程式
import numpy as np
 
# 建立陣列物件
arr = np.array( [[ 1, 2, 3],
                 [ 4, 2, 5]] )
 
# arr 物件的列印型別
print("Array is of type: ", type(arr))
 
# 列印陣列維度(軸)
print("No. of dimensions: ", arr.ndim)
 
# 陣列的列印形狀
print("Shape of array: ", arr.shape)
 
# 陣列的列印大小(元素總數)
print("Size of array: ", arr.size)
 
# 列印陣列中元素的型別
print("Array stores elements of type: ", arr.dtype)

輸出 :

Array is of type:  <class 'numpy.ndarray'>
No. of dimensions:  2
Shape of array:  (2, 3)
Size of array:  6
Array stores elements of type:  int64

陣列建立

在 NumPy 中有多種建立陣列的方法。

  • 例如,您可以使用array函數從常規 Python列表元組建立一個陣列。 結果陣列的型別是從序列中元素的型別推匯出來的。****
  • 通常,陣列的元素最初是未知的,但它的大小是已知的。因此,NumPy 提供了幾個函數來建立具有初始預留位置內容的陣列。這些最大限度地減少了增長陣列的必要性,這是一項昂貴的操作。
    例如:  np.zeros、np.ones、np.full、np.empty 等。
  • 為了建立數位序列,NumPy 提供了一個類似於 range 的函數,它返回陣列而不是列表。
  • arange: 返回給定間隔內均勻分佈的值。長是指定的。
  • linspace: 返回給定間隔內均勻分佈的值。編號_ 的元素被返回。
  • 重塑陣列: 我們可以使用reshape方法來重塑陣列。考慮一個形狀為 (a1, a2, a3, ..., aN) 的陣列。我們可以重新整形並將其轉換為另一個形狀為 (b1, b2, b3, ..., bM) 的陣列。唯一需要的條件是:
    a1 x a2 x a3 … x aN = b1 x b2 x b3 … x bM 。(即陣列的原始大小保持不變。)
  • 扁平化陣列: 我們可以使用扁平化方法將陣列的副本摺疊成一維。它接受order引數。預設值為“C”(用於行優先順序)。使用“F”表示列主要順序。

注意: 陣列的型別可以在建立陣列時顯式定義。

# 演示陣列建立技術的 Python 程式
import numpy as np
 
# 從浮點型別的列表建立陣列
a = np.array([[1, 2, 4], [5, 8, 7]], dtype = 'float')
print ("Array created using passed list:n", a)
 
# 從元組建立陣列
b = np.array((1 , 3, 2))
print ("nArray created using passed tuple:n", b)
 
# 建立一個全為零的 3X4 陣列
c = np.zeros((3, 4))
print ("nAn array initialized with all zeros:n", c)
 
# 建立一個複雜型別的常數值陣列
d = np.full((3, 3), 6, dtype = 'complex')
print ("nAn array initialized with all 6s."
            "Array type is complex:n", d)

輸出 :

Array created using passed list:
 [[ 1.  2.  4.]
 [ 5.  8.  7.]]

Array created using passed tuple:
 [1 3 2]

An array initialized with all zeros:
 [[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]

An array initialized with all 6s. Array type is complex:
 [[ 6.+0.j  6.+0.j  6.+0.j]
 [ 6.+0.j  6.+0.j  6.+0.j]
 [ 6.+0.j  6.+0.j  6.+0.j]]

陣列索引

瞭解陣列索引的基礎知識對於分析和運算元組物件很重要。NumPy 提供了許多方法來進行陣列索引。

  • 切片: 就像 python 中的列表一樣,NumPy 陣列可以切片。由於陣列可以是多維的,因此您需要為陣列的每個維度指定一個切片。
  • 整數陣列索引: 在此方法中,傳遞列表以對每個維度進行索引。完成對應元素的一對一對映以構造一個新的任意陣列。
  • 布林陣列索引: 當我們想從陣列中選擇滿足某些條件的元素時使用此方法。
# 在 numpy 中演示索引的 Python 程式
import numpy as np
 
# 一個範例陣列
arr = np.array([[-1, 2, 0, 4],
                [4, -0.5, 6, 0],
                [2.6, 0, 7, 8],
                [3, -7, 4, 2.0]])
 
# 切片陣列
temp = arr[:2, ::2]
print ("Array with first 2 rows and alternate"
                    "columns(0 and 2):n", temp)
 
# 整數陣列索引範例
temp = arr[[0, 1, 2, 3], [3, 2, 1, 0]]
print ("nElements at indices (0, 3), (1, 2), (2, 1),"
                                    "(3, 0):n", temp)
 
# 布林陣列索引範例
cond = arr > 0 # cond is a boolean array
temp = arr[cond]
print ("nElements greater than 0:n", temp)

輸出 :

Array with first 2 rows and alternatecolumns(0 and 2):
 [[-1.  0.]
 [ 4.  6.]]

Elements at indices (0, 3), (1, 2), (2, 1),(3, 0):
 [ 4.  6.  0.  3.]

Elements greater than 0:
 [ 2.   4.   4.   6.   2.6  7.   8.   3.   4.   2. ]

基本操作

NumPy 提供了大量的內建算術函數。

對單個陣列的操作: 我們可以使用過載的算術運運算元對陣列進行元素操作以建立一個新陣列。在 +=、-=、*= 運運算元的情況下,將修改現有陣列。

# 演示單個陣列的基本操作的 Python 程式
import numpy as np
 
a = np.array([1, 2, 5, 3])
 
# 每個元素加 1
print ("Adding 1 to every element:", a+1)
 
# 從每個元素中減去 3
print ("Subtracting 3 from each element:", a-3)
 
# 將每個元素乘以 10
print ("Multiplying each element by 10:", a*10)
 
# 平方每個元素
print ("Squaring each element:", a**2)
 
# 修改現有陣列
a *= 2
print ("Doubled each element of original array:", a)
 
# 陣列轉置
a = np.array([[1, 2, 3], [3, 4, 5], [9, 6, 0]])
 
print ("nOriginal array:n", a)
print ("Transpose of array:n", a.T)

輸出 :

Adding 1 to every element: [2 3 6 4]
Subtracting 3 from each element: [-2 -1  2  0]
Multiplying each element by 10: [10 20 50 30]
Squaring each element: [ 1  4 25  9]
Doubled each element of original array: [ 2  4 10  6]

Original array:
 [[1 2 3]
 [3 4 5]
 [9 6 0]]
Transpose of array:
 [[1 3 9]
 [2 4 6]
 [3 5 0]]

一元運運算元:許多一元運算作為 ndarray類的方法提供。這包括 sum、min、max 等。這些函數也可以通過設定軸引數來逐行或逐列應用。

# 在 numpy 中演示一元運運算元的 Python 程式
import numpy as np
 
arr = np.array([[1, 5, 6],
                [4, 7, 2],
                [3, 1, 9]])
 
# 陣列的最大元素
print ("Largest element is:", arr.max())
print ("Row-wise maximum elements:",
                    arr.max(axis = 1))
 
# 陣列的最小元素
print ("Column-wise minimum elements:",
                        arr.min(axis = 0))
 
# 陣列元素之和
print ("Sum of all array elements:",
                            arr.sum())
 
# 每行的累積總和
print ("Cumulative sum along each row:n",
                        arr.cumsum(axis = 1))

輸出 :

Largest element is: 9
Row-wise maximum elements: [6 7 9]
Column-wise minimum elements: [1 1 2]
Sum of all array elements: 38
Cumulative sum along each row:
[[ 1  6 12]
 [ 4 11 13]
 [ 3  4 13]]

二元運運算元: 這些操作適用於陣列元素並建立一個新陣列。您可以使用所有基本的算術運運算元,如 +、-、/、等。如果是 +=、-=、  = 運運算元,則會修改現有陣列。

# 在 Numpy 中演示二元運運算元的 Python 程式
import numpy as np
 
a = np.array([[1, 2],
            [3, 4]])
b = np.array([[4, 3],
            [2, 1]])
 
# 新增陣列
print ("Array sum:n", a + b)
 
# 乘法陣列(元素乘法)
print ("Array multiplication:n", a*b)
 
# 矩陣乘法
print ("Matrix multiplication:n", a.dot(b))

輸出:

Array sum:
[[5 5]
 [5 5]]
Array multiplication:
[[4 6]
 [6 4]]
Matrix multiplication:
[[ 8  5]
 [20 13]]

通用函數 (ufunc):  NumPy 提供熟悉的數學函數,例如 sin、cos、exp 等。這些函數還對陣列進行元素操作,生成陣列作為輸出。

注意: 我們上面使用過載運運算元所做的所有操作都可以使用 ufunc 完成,例如 np.add、np.subtract、np.multiply、np.divide、np.sum 等。

# 在 numpy 中演示通用函數的 Python 程式
import numpy as np
 
# 建立一個正弦值陣列
a = np.array([0, np.pi/2, np.pi])
print ("Sine values of array elements:", np.sin(a))
 
# exponential values
a = np.array([0, 1, 2, 3])
print ("Exponent of array elements:", np.exp(a))
 
# square root of array values
print ("Square root of array elements:", np.sqrt(a))

輸出:

Sine values of array elements: [  0.00000000e+00   1.00000000e+00   1.22464680e-16]
Exponent of array elements: [  1.           2.71828183   7.3890561   20.08553692]
Square root of array elements: [ 0.          1.          1.41421356  1.73205081]

資料型別

每個 ndarray 都有一個關聯的資料型別 (dtype) 物件。這個資料型別物件(dtype)告訴我們陣列的佈局。這意味著它為我們提供了以下資訊:

  • 資料型別(整數、浮點數、Python 物件等)
  • 資料大小(位元組數)
  • 資料的位元組順序(小端或大端)
  • 如果資料型別是子陣列,它的形狀和資料型別是什麼。

ndarray的值儲存在緩衝區中,可以將其視為連續的記憶體位元組塊。所以這些位元組將如何被解釋由 dtype 物件給出。

每個 Numpy 陣列都是一個元素表(通常是數位),所有元素型別相同,由正整數元組索引。每個 ndarray 都有一個關聯的資料型別 (dtype) 物件。

此資料型別物件 (dtype) 提供有關陣列布局的資訊。ndarray 的值儲存在緩衝區中,可以將其視為可以由 dtype 物件解釋的連續記憶體位元組塊。Numpy 提供了大量可用於構造陣列的數值資料型別。

在建立陣列時,Numpy 會嘗試猜測資料型別,但構造陣列的函數通常還包含一個可選引數來顯式指定資料型別。

# Python Program to create a data type object
import numpy as np
 
# np.int16 is converted into a data type object.
print(np.dtype(np.int16))

輸出:

int16

# Python Program to create a data type object 
# containing a 32 bit big-endian integer
import numpy as np
 
# i4 represents integer of size 4 byte
# > represents big-endian byte ordering and
# < represents little-endian encoding.
# dt is a dtype object
dt = np.dtype('>i4')
 
print("Byte order is:",dt.byteorder)
 
print("Size is:",dt.itemsize)
 
print("Data type is:",dt.name)

輸出:

Byte order is: >
Size is: 4
Name of data type is: int32

到此這篇關於Python NumPy教學之陣列的基本操作詳解的文章就介紹到這了,更多相關Python NumPy陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com