深入解析NumPy的核心函數np.array
- NumPy與np.array()簡介
- NumPy的重要性
- np.array()的作用
- np.array()函數的詳細參數
- object參數
- dtype參數
- copy參數
- order參數
- subok參數
- ndmin參數
- like參數
- np.array()函數的使用示例
- 創建基本的一維和二維數組
- 創建具有特定數據類型的數組
- 創建多維數組
- 從其他數據結構轉換為數組
- 使用ndmin參數創建具有最小維度的數組
- np.array()函數與與Python原生列表的比較
NumPy為Python提供了高效的多維數組對象以及一系列用于處理這些數組的工具,極大地簡化了數值計算的過程。而np.array()
作為NumPy庫的核心函數之一,是創建和操作數組的基礎。
NumPy與np.array()簡介
NumPy(Numerical Python的簡稱)是Python中用于處理數組運算的擴展庫,它提供了大量的數學函數來操作數組,使得數組的處理變得高效且簡潔。np.array()
則是NumPy庫中的一個基礎函數,用于創建數組。
NumPy的重要性
NumPy在科學計算、數據分析、機器學習等眾多領域都有著廣泛的應用。它的高效性源于其底層使用C語言實現,能夠充分利用計算機的硬件資源,對數組進行快速的運算。與Python原生的列表相比,NumPy數組在內存中是連續存儲的,這使得數組元素之間的訪問和計算更為高效。例如,在進行大規模的數據處理時,使用NumPy數組可以顯著提高程序的運行速度。
np.array()的作用
np.array()
函數的主要作用是將Python中的各種數據結構(如列表、元組等)轉換為NumPy數組,或者根據指定的參數創建一個新的數組。通過np.array()
創建的數組可以方便地進行各種數學運算、索引和切片操作,為后續的數據處理和分析提供了基礎。
np.array()函數的詳細參數
np.array()
函數的完整語法為:numpy.array(object, dtype = None, *, copy = True, order = 'K', subok = False, ndmin = 0, like = None)
。下面我們來詳細介紹每個參數的含義和用法。
object參數
object
參數是必填項,它表示要轉換為數組的對象,可以是一個數組、任何暴露數組接口的對象、其__array__
方法返回數組的對象,或者任何(嵌套的)序列。如果object
是一個標量,則返回一個包含該標量的0維數組。
例如,我們可以使用列表來創建一個一維數組:
import numpy as np
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)
輸出結果為:[1 2 3 4 5]
也可以使用嵌套列表來創建一個二維數組:
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)
輸出結果為:
[[1 2 3][4 5 6][7 8 9]]
dtype參數
dtype
參數用于指定數組的數據類型,它是可選的。如果不指定dtype
,NumPy會根據傳入的數據自動推斷出合適的數據類型。例如:
arr = np.array([1, 2, 3])
print(arr.dtype)
輸出結果為:int64
在這個例子中,由于傳入的數據都是整數,NumPy自動推斷出數組的數據類型為int64
。
然而,在某些情況下,我們可能需要顯式地指定數據類型,以滿足特定的需求。比如,當我們需要創建一個包含浮點數的數組時,可以這樣做:
arr_float = np.array([1, 2, 3], dtype = np.float32)
print(arr_float.dtype)
輸出結果為:float32
通過指定dtype = np.float32
,我們創建了一個數據類型為32位浮點數的數組。
指定數據類型的好處之一是可以優化內存使用。例如,如果我們知道數組中的數據范圍較小,并且不需要高精度的計算,可以使用較小的數據類型,如int8
或float16
,這樣可以減少內存的占用。
copy參數
copy
參數用于控制是否復制數據,它是一個布爾值,默認為True
。當copy = True
時,無論輸入數據的來源如何,都會創建一個數據的副本;當copy = False
時,如果輸入數據本身就是一個NumPy數組,并且不需要進行任何數據類型轉換或其他修改,那么將不會復制數據,而是直接使用原數組的引用。
需要注意的是,當copy = None
時,只有在__array__
返回副本、obj
是嵌套序列或需要滿足其他要求(如dtype
、order
等)時才會進行復制。
例如,下面的代碼中,由于輸入數據是一個列表,所以無論copy
參數的值如何,都會創建一個新的數組副本:
list_data = [1, 2, 3]
arr1 = np.array(list_data, copy = True)
arr2 = np.array(list_data, copy = False)
arr3 = np.array(list_data, copy = None)
print(arr1 is arr2) # False
print(arr1 is arr3) # False
輸出結果均為False
,說明arr1
、arr2
和arr3
都是不同的數組對象。
而當輸入數據是一個NumPy數組時,如果copy = False
且不需要進行其他修改,那么將不會復制數據:
arr4 = np.array([1, 2, 3])
arr5 = np.array(arr4, copy = False)
print(arr4 is arr5) # True
輸出結果為True
,說明arr4
和arr5
指向同一個數組對象。
order參數
order
參數用于指定數組在內存中的存儲順序,它有四個可選值:'K'
、'A'
、'C'
、'F'
。
'C'
表示按C語言的行優先順序存儲,即先存儲第一行,再存儲第二行,以此類推。'F'
表示按Fortran語言的列優先順序存儲,即先存儲第一列,再存儲第二列,以此類推。'A'
表示如果輸入數據是Fortran連續的,則按'F'
順序存儲,否則按'C'
順序存儲。'K'
表示盡可能保持輸入數據的原始順序。
默認情況下,order = 'K'
。
例如,我們可以通過order
參數來控制二維數組的存儲順序:
arr_2d_c = np.array([[1, 2, 3], [4, 5, 6]], order = 'C')
arr_2d_f = np.array([[1, 2, 3], [4, 5, 6]], order = 'F')
print(arr_2d_c.flags)
print(arr_2d_f.flags)
輸出結果分別為:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
從輸出結果可以看出,arr_2d_c
是按行優先順序存儲的(C_CONTIGUOUS : True
),而arr_2d_f
是按列優先順序存儲的(F_CONTIGUOUS : True
)。
subok參數
subok
參數是一個布爾值,默認為False
。當subok = True
時,返回的數組將保留輸入數據的子類類型;當subok = False
時,無論輸入數據的類型如何,返回的數組都將被強制轉換為基類ndarray
類型。
例如,假設我們有一個自定義的數組子類MyArray
,它繼承自np.ndarray
:
class MyArray(np.ndarray):pass
data = MyArray([1, 2, 3])
arr1 = np.array(data, subok = True)
arr2 = np.array(data, subok = False)
print(type(arr1)) # <class '__main__.MyArray'>
print(type(arr2)) # <class 'numpy.ndarray'>
輸出結果表明,當subok = True
時,arr1
仍然是MyArray
類型;而當subok = False
時,arr2
被轉換為了np.ndarray
類型。
ndmin參數
ndmin
參數用于指定返回數組的最小維度,它是一個整數,默認為0
。如果輸入數據的維度小于ndmin
,則會在數組的形狀前面添加一維,直到滿足最小維度的要求。
例如:
arr1 = np.array([1, 2, 3], ndmin = 1)
arr2 = np.array([1, 2, 3], ndmin = 2)
arr3 = np.array([1, 2, 3], ndmin = 3)
print(arr1.shape) # (3,)
print(arr2.shape) # (1, 3)
print(arr3.shape) # (1, 1, 3)
在這個例子中,輸入數據[1, 2, 3]
是一個一維數組。當ndmin = 1
時,數組形狀不變;當ndmin = 2
時,在前面添加了一維,變成了二維數組(1, 3)
;當ndmin = 3
時,在前面添加了兩維,變成了三維數組(1, 1, 3)
。
like參數
like
參數是在NumPy 1.20.0版本中新增的,它用于指定一個參考對象,以便創建與該對象兼容的數組。如果傳入的like
參數支持__array_function__
協議,那么結果將由該協議定義。
例如:
arr = np.array([1, 2, 3])
new_arr = np.array([4, 5, 6], like = arr)
print(type(new_arr)) # <class 'numpy.ndarray'>
在這個例子中,我們以arr
為參考對象,創建了一個新的數組new_arr
,new_arr
的類型與arr
相同,都是np.ndarray
。
np.array()函數的使用示例
創建基本的一維和二維數組
如前文所述,使用np.array()
函數可以很方便地創建一維和二維數組。
創建一維數組:
arr_1d = np.array([1, 2, 3, 4, 5])
print(arr_1d)
創建二維數組:
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_2d)
創建具有特定數據類型的數組
通過dtype
參數,我們可以創建具有特定數據類型的數組。
創建整數類型的數組:
arr_int = np.array([1, 2, 3], dtype = np.int16)
print(arr_int.dtype)
創建浮點數類型的數組:
arr_float = np.array([1.0, 2.0, 3.0], dtype = np.float64)
print(arr_float.dtype)
創建復數類型的數組:
arr_complex = np.array([1 + 1j, 2 + 2j, 3 + 3j], dtype = np.complex128)
print(arr_complex.dtype)
創建多維數組
np.array()
函數不僅可以創建一維和二維數組,還可以創建更高維度的數組。只需在傳入的序列中嵌套更多的層級即可。
創建三維數組:
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr_3d)
輸出結果為:
[[[1 2][3 4]][[5 6][7 8]]]
從其他數據結構轉換為數組
除了使用列表和元組來創建數組外,np.array()
函數還可以將其他數據結構轉換為數組。
將集合轉換為數組:
set_data = {1, 2, 3, 3} # 集合會自動去重
arr_set = np.array(set_data)
print(arr_set)
輸出結果為:[1 2 3]
將字符串轉換為數組:
str_data = "hello"
arr_str = np.array(list(str_data))
print(arr_str)
輸出結果為:['h' 'e' 'l' 'l' 'o']
使用ndmin參數創建具有最小維度的數組
通過ndmin
參數,我們可以確保創建的數組具有指定的最小維度。
arr1 = np.array([1, 2, 3], ndmin = 2)
print(arr1.shape) # (1, 3)
arr2 = np.array([1, 2, 3], ndmin = 3)
print(arr2.shape) # (1, 1, 3)
np.array()函數與與Python原生列表的比較
雖然Python原生列表也可以存儲多個元素,但與NumPy數組相比,它們有很多不同之處。
- 內存存儲:NumPy數組在內存中是連續存儲的,而Python列表是離散存儲的。這使得NumPy數組在進行數值計算時能夠更高效地利用內存,提高計算速度。
- 數據類型:NumPy數組中的所有元素必須是同一數據類型,而Python列表可以包含不同數據類型的元素。這使得NumPy數組在進行數學運算時更加高效,因為不需要進行類型檢查和轉換。
- 運算效率:由于NumPy數組的內存存儲方式和數據類型的一致性,NumPy提供了大量的優化函數,能夠對數組進行快速的數學運算。相比之下,使用Python原生列表進行相同的運算需要編寫循環,效率較低。
例如,計算兩個數組的元素之和:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
result_np = arr1 + arr2
print(result_np)
輸出結果為:[5 7 9]
而使用Python原生列表實現相同的功能:
list1 = [1, 2, 3]
list2 = [4, 5, 6]
result_list = []
for i in range(len(list1)):result_list.append(list1[i] + list2[i])
print(result_list)
輸出結果為:[5, 7, 9]
可以看到,使用NumPy數組的代碼更加簡潔,且在處理大規模數據時,運算效率會更高。
That’s all, thanks for reading!
覺得有用就點個贊
、收進收藏
夾吧!關注
我,獲取更多干貨~