深入解析NumPy的核心函數(shù)np.array()
NumPy為Python提供了高效的多維數(shù)組對(duì)象以及一系列用于處理這些數(shù)組的工具,極大地簡(jiǎn)化了數(shù)值計(jì)算的過(guò)程。而np.array()
作為NumPy庫(kù)的核心函數(shù)之一,是創(chuàng)建和操作數(shù)組的基礎(chǔ)。
NumPy與np.array()簡(jiǎn)介
NumPy(Numerical Python的簡(jiǎn)稱(chēng))是Python中用于處理數(shù)組運(yùn)算的擴(kuò)展庫(kù),它提供了大量的數(shù)學(xué)函數(shù)來(lái)操作數(shù)組,使得數(shù)組的處理變得高效且簡(jiǎn)潔。np.array()
則是NumPy庫(kù)中的一個(gè)基礎(chǔ)函數(shù),用于創(chuàng)建數(shù)組。
NumPy的重要性
NumPy在科學(xué)計(jì)算、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)等眾多領(lǐng)域都有著廣泛的應(yīng)用。它的高效性源于其底層使用C語(yǔ)言實(shí)現(xiàn),能夠充分利用計(jì)算機(jī)的硬件資源,對(duì)數(shù)組進(jìn)行快速的運(yùn)算。與Python原生的列表相比,NumPy數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,這使得數(shù)組元素之間的訪問(wèn)和計(jì)算更為高效。例如,在進(jìn)行大規(guī)模的數(shù)據(jù)處理時(shí),使用NumPy數(shù)組可以顯著提高程序的運(yùn)行速度。
np.array()的作用
np.array()
函數(shù)的主要作用是將Python中的各種數(shù)據(jù)結(jié)構(gòu)(如列表、元組等)轉(zhuǎn)換為NumPy數(shù)組,或者根據(jù)指定的參數(shù)創(chuàng)建一個(gè)新的數(shù)組。通過(guò)np.array()
創(chuàng)建的數(shù)組可以方便地進(jìn)行各種數(shù)學(xué)運(yùn)算、索引和切片操作,為后續(xù)的數(shù)據(jù)處理和分析提供了基礎(chǔ)。
np.array()函數(shù)的詳細(xì)參數(shù)
np.array()
函數(shù)的完整語(yǔ)法為:numpy.array(object, dtype = None, *, copy = True, order = 'K', subok = False, ndmin = 0, like = None)
。下面我們來(lái)詳細(xì)介紹每個(gè)參數(shù)的含義和用法。
object參數(shù)
object
參數(shù)是必填項(xiàng),它表示要轉(zhuǎn)換為數(shù)組的對(duì)象,可以是一個(gè)數(shù)組、任何暴露數(shù)組接口的對(duì)象、其__array__
方法返回?cái)?shù)組的對(duì)象,或者任何(嵌套的)序列。如果object
是一個(gè)標(biāo)量,則返回一個(gè)包含該標(biāo)量的0維數(shù)組。
例如,我們可以使用列表來(lái)創(chuàng)建一個(gè)一維數(shù)組:
import numpy as np arr_1d = np.array([1, 2, 3, 4, 5]) print(arr_1d)
輸出結(jié)果為:[1 2 3 4 5]
也可以使用嵌套列表來(lái)創(chuàng)建一個(gè)二維數(shù)組:
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr_2d)
輸出結(jié)果為:
[[1 2 3]
[4 5 6]
[7 8 9]]
dtype參數(shù)
dtype
參數(shù)用于指定數(shù)組的數(shù)據(jù)類(lèi)型,它是可選的。如果不指定dtype
,NumPy會(huì)根據(jù)傳入的數(shù)據(jù)自動(dòng)推斷出合適的數(shù)據(jù)類(lèi)型。例如:
arr = np.array([1, 2, 3]) print(arr.dtype)
輸出結(jié)果為:int64
在這個(gè)例子中,由于傳入的數(shù)據(jù)都是整數(shù),NumPy自動(dòng)推斷出數(shù)組的數(shù)據(jù)類(lèi)型為int64
。
然而,在某些情況下,我們可能需要顯式地指定數(shù)據(jù)類(lèi)型,以滿足特定的需求。比如,當(dāng)我們需要?jiǎng)?chuàng)建一個(gè)包含浮點(diǎn)數(shù)的數(shù)組時(shí),可以這樣做:
arr_float = np.array([1, 2, 3], dtype = np.float32) print(arr_float.dtype)
輸出結(jié)果為:float32
通過(guò)指定dtype = np.float32
,我們創(chuàng)建了一個(gè)數(shù)據(jù)類(lèi)型為32位浮點(diǎn)數(shù)的數(shù)組。
指定數(shù)據(jù)類(lèi)型的好處之一是可以優(yōu)化內(nèi)存使用。例如,如果我們知道數(shù)組中的數(shù)據(jù)范圍較小,并且不需要高精度的計(jì)算,可以使用較小的數(shù)據(jù)類(lèi)型,如int8
或float16
,這樣可以減少內(nèi)存的占用。
copy參數(shù)
copy
參數(shù)用于控制是否復(fù)制數(shù)據(jù),它是一個(gè)布爾值,默認(rèn)為True
。當(dāng)copy = True
時(shí),無(wú)論輸入數(shù)據(jù)的來(lái)源如何,都會(huì)創(chuàng)建一個(gè)數(shù)據(jù)的副本;當(dāng)copy = False
時(shí),如果輸入數(shù)據(jù)本身就是一個(gè)NumPy數(shù)組,并且不需要進(jìn)行任何數(shù)據(jù)類(lèi)型轉(zhuǎn)換或其他修改,那么將不會(huì)復(fù)制數(shù)據(jù),而是直接使用原數(shù)組的引用。
需要注意的是,當(dāng)copy = None
時(shí),只有在__array__
返回副本、obj
是嵌套序列或需要滿足其他要求(如dtype
、order
等)時(shí)才會(huì)進(jìn)行復(fù)制。
例如,下面的代碼中,由于輸入數(shù)據(jù)是一個(gè)列表,所以無(wú)論copy
參數(shù)的值如何,都會(huì)創(chuàng)建一個(gè)新的數(shù)組副本:
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
輸出結(jié)果均為False
,說(shuō)明arr1
、arr2
和arr3
都是不同的數(shù)組對(duì)象。
而當(dāng)輸入數(shù)據(jù)是一個(gè)NumPy數(shù)組時(shí),如果copy = False
且不需要進(jìn)行其他修改,那么將不會(huì)復(fù)制數(shù)據(jù):
arr4 = np.array([1, 2, 3]) arr5 = np.array(arr4, copy = False) print(arr4 is arr5) # True
輸出結(jié)果為True
,說(shuō)明arr4
和arr5
指向同一個(gè)數(shù)組對(duì)象。
order參數(shù)
order
參數(shù)用于指定數(shù)組在內(nèi)存中的存儲(chǔ)順序,它有四個(gè)可選值:'K'
、'A'
、'C'
、'F'
。
'C'
表示按C語(yǔ)言的行優(yōu)先順序存儲(chǔ),即先存儲(chǔ)第一行,再存儲(chǔ)第二行,以此類(lèi)推。'F'
表示按Fortran語(yǔ)言的列優(yōu)先順序存儲(chǔ),即先存儲(chǔ)第一列,再存儲(chǔ)第二列,以此類(lèi)推。'A'
表示如果輸入數(shù)據(jù)是Fortran連續(xù)的,則按'F'
順序存儲(chǔ),否則按'C'
順序存儲(chǔ)。'K'
表示盡可能保持輸入數(shù)據(jù)的原始順序。
默認(rèn)情況下,order = 'K'
。
例如,我們可以通過(guò)order
參數(shù)來(lái)控制二維數(shù)組的存儲(chǔ)順序:
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)
輸出結(jié)果分別為:
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
從輸出結(jié)果可以看出,arr_2d_c
是按行優(yōu)先順序存儲(chǔ)的(C_CONTIGUOUS : True
),而arr_2d_f
是按列優(yōu)先順序存儲(chǔ)的(F_CONTIGUOUS : True
)。
subok參數(shù)
subok
參數(shù)是一個(gè)布爾值,默認(rèn)為False
。當(dāng)subok = True
時(shí),返回的數(shù)組將保留輸入數(shù)據(jù)的子類(lèi)類(lèi)型;當(dāng)subok = False
時(shí),無(wú)論輸入數(shù)據(jù)的類(lèi)型如何,返回的數(shù)組都將被強(qiáng)制轉(zhuǎn)換為基類(lèi)ndarray
類(lèi)型。
例如,假設(shè)我們有一個(gè)自定義的數(shù)組子類(lèi)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'>
輸出結(jié)果表明,當(dāng)subok = True
時(shí),arr1
仍然是MyArray
類(lèi)型;而當(dāng)subok = False
時(shí),arr2
被轉(zhuǎn)換為了np.ndarray
類(lèi)型。
ndmin參數(shù)
ndmin
參數(shù)用于指定返回?cái)?shù)組的最小維度,它是一個(gè)整數(shù),默認(rèn)為0
。如果輸入數(shù)據(jù)的維度小于ndmin
,則會(huì)在數(shù)組的形狀前面添加一維,直到滿足最小維度的要求。
例如:
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)
在這個(gè)例子中,輸入數(shù)據(jù)[1, 2, 3]
是一個(gè)一維數(shù)組。當(dāng)ndmin = 1
時(shí),數(shù)組形狀不變;當(dāng)ndmin = 2
時(shí),在前面添加了一維,變成了二維數(shù)組(1, 3)
;當(dāng)ndmin = 3
時(shí),在前面添加了兩維,變成了三維數(shù)組(1, 1, 3)
。
like參數(shù)
like
參數(shù)是在NumPy 1.20.0版本中新增的,它用于指定一個(gè)參考對(duì)象,以便創(chuàng)建與該對(duì)象兼容的數(shù)組。如果傳入的like
參數(shù)支持__array_function__
協(xié)議,那么結(jié)果將由該協(xié)議定義。
例如:
arr = np.array([1, 2, 3]) new_arr = np.array([4, 5, 6], like = arr) print(type(new_arr)) # <class 'numpy.ndarray'>
在這個(gè)例子中,我們以arr
為參考對(duì)象,創(chuàng)建了一個(gè)新的數(shù)組new_arr
,new_arr
的類(lèi)型與arr
相同,都是np.ndarray
。
np.array()函數(shù)的使用示例
創(chuàng)建基本的一維和二維數(shù)組
如前文所述,使用np.array()
函數(shù)可以很方便地創(chuàng)建一維和二維數(shù)組。
創(chuàng)建一維數(shù)組:
arr_1d = np.array([1, 2, 3, 4, 5]) print(arr_1d)
創(chuàng)建二維數(shù)組:
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr_2d)
創(chuàng)建具有特定數(shù)據(jù)類(lèi)型的數(shù)組
通過(guò)dtype
參數(shù),我們可以創(chuàng)建具有特定數(shù)據(jù)類(lèi)型的數(shù)組。
創(chuàng)建整數(shù)類(lèi)型的數(shù)組:
arr_int = np.array([1, 2, 3], dtype = np.int16) print(arr_int.dtype)
創(chuàng)建浮點(diǎn)數(shù)類(lèi)型的數(shù)組:
arr_float = np.array([1.0, 2.0, 3.0], dtype = np.float64) print(arr_float.dtype)
創(chuàng)建復(fù)數(shù)類(lèi)型的數(shù)組:
arr_complex = np.array([1 + 1j, 2 + 2j, 3 + 3j], dtype = np.complex128) print(arr_complex.dtype)
創(chuàng)建多維數(shù)組
np.array()
函數(shù)不僅可以創(chuàng)建一維和二維數(shù)組,還可以創(chuàng)建更高維度的數(shù)組。只需在傳入的序列中嵌套更多的層級(jí)即可。
創(chuàng)建三維數(shù)組:
arr_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(arr_3d)
輸出結(jié)果為:
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
從其他數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為數(shù)組
除了使用列表和元組來(lái)創(chuàng)建數(shù)組外,np.array()
函數(shù)還可以將其他數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為數(shù)組。
將集合轉(zhuǎn)換為數(shù)組:
set_data = {1, 2, 3, 3} # 集合會(huì)自動(dòng)去重 arr_set = np.array(set_data) print(arr_set)
輸出結(jié)果為:[1 2 3]
將字符串轉(zhuǎn)換為數(shù)組:
str_data = "hello" arr_str = np.array(list(str_data)) print(arr_str)
輸出結(jié)果為:['h' 'e' 'l' 'l' 'o']
使用ndmin參數(shù)創(chuàng)建具有最小維度的數(shù)組
通過(guò)ndmin
參數(shù),我們可以確保創(chuàng)建的數(shù)組具有指定的最小維度。
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()函數(shù)與與Python原生列表的比較
雖然Python原生列表也可以存儲(chǔ)多個(gè)元素,但與NumPy數(shù)組相比,它們有很多不同之處。
- 內(nèi)存存儲(chǔ):NumPy數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的,而Python列表是離散存儲(chǔ)的。這使得NumPy數(shù)組在進(jìn)行數(shù)值計(jì)算時(shí)能夠更高效地利用內(nèi)存,提高計(jì)算速度。
- 數(shù)據(jù)類(lèi)型:NumPy數(shù)組中的所有元素必須是同一數(shù)據(jù)類(lèi)型,而Python列表可以包含不同數(shù)據(jù)類(lèi)型的元素。這使得NumPy數(shù)組在進(jìn)行數(shù)學(xué)運(yùn)算時(shí)更加高效,因?yàn)椴恍枰M(jìn)行類(lèi)型檢查和轉(zhuǎn)換。
- 運(yùn)算效率:由于NumPy數(shù)組的內(nèi)存存儲(chǔ)方式和數(shù)據(jù)類(lèi)型的一致性,NumPy提供了大量的優(yōu)化函數(shù),能夠?qū)?shù)組進(jìn)行快速的數(shù)學(xué)運(yùn)算。相比之下,使用Python原生列表進(jìn)行相同的運(yùn)算需要編寫(xiě)循環(huán),效率較低。
例如,計(jì)算兩個(gè)數(shù)組的元素之和:
import numpy as np arr1 = np.array([1, 2, 3]) arr2 = np.array([4, 5, 6]) result_np = arr1 + arr2 print(result_np)
輸出結(jié)果為:[5 7 9]
而使用Python原生列表實(shí)現(xiàn)相同的功能:
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)
輸出結(jié)果為:[5, 7, 9]
可以看到,使用NumPy數(shù)組的代碼更加簡(jiǎn)潔,且在處理大規(guī)模數(shù)據(jù)時(shí),運(yùn)算效率會(huì)更高。
到此這篇關(guān)于深入解析NumPy的核心函數(shù)np.array()的文章就介紹到這了,更多相關(guān)NumPy np.array()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python模塊對(duì)Redis數(shù)據(jù)庫(kù)的連接與使用講解
這篇文章主要介紹了Python模塊對(duì)Redis數(shù)據(jù)庫(kù)的連接與使用,通過(guò)實(shí)例代碼給大家介紹了Python連接Redis數(shù)據(jù)庫(kù)方法,Python使用連接池連接Redis數(shù)據(jù)庫(kù)方法,感興趣的朋友跟隨小編一起看看吧2021-07-07使用wxPython和pandas模塊生成Excel文件的代碼實(shí)現(xiàn)
在Python編程中,有時(shí)我們需要根據(jù)特定的數(shù)據(jù)生成Excel文件,本文將介紹如何使用wxPython和pandas模塊來(lái)實(shí)現(xiàn)這個(gè)目標(biāo),文中通過(guò)代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-05-05python def 定義函數(shù),調(diào)用函數(shù)方式
這篇文章主要介紹了python def 定義函數(shù),調(diào)用函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06使用python對(duì)泰坦尼克號(hào)幸存者進(jìn)行數(shù)據(jù)分析與預(yù)測(cè)
這篇文章主要介紹了使用python對(duì)泰坦尼克號(hào)幸存者進(jìn)行數(shù)據(jù)分析與預(yù)測(cè),應(yīng)用機(jī)器學(xué)習(xí)的工具來(lái)預(yù)測(cè)哪些乘客在悲劇中幸存下來(lái)2023-03-03Python爬蟲(chóng)代理IP池實(shí)現(xiàn)方法
在公司做分布式深網(wǎng)爬蟲(chóng),搭建了一套穩(wěn)定的代理池服務(wù),為上千個(gè)爬蟲(chóng)提供有效的代理,保證各個(gè)爬蟲(chóng)拿到的都是對(duì)應(yīng)網(wǎng)站有效的代理IP,從而保證爬蟲(chóng)快速穩(wěn)定的運(yùn)行,所以就想利用一些免費(fèi)的資源搞一個(gè)簡(jiǎn)單的代理池服務(wù)。2017-01-01python3實(shí)現(xiàn)Dijkstra算法最短路徑的實(shí)現(xiàn)
這篇文章主要介紹了python3實(shí)現(xiàn)Dijkstra算法最短路徑的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05python3 通過(guò) pybind11 使用Eigen加速代碼的步驟詳解
這篇文章主要介紹了python3 通過(guò) pybind11 使用Eigen加速代碼的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12