Numpy 中文用戶指南 3.2 創(chuàng)建數(shù)組

原文:Array creation

譯者:飛龍

?

另見

數(shù)組創(chuàng)建例程

導(dǎo)言

數(shù)組創(chuàng)建的一般機(jī)制有五種:

  • 從其它Python的結(jié)構(gòu)轉(zhuǎn)換(如列表和元組)
  • 內(nèi)置的NumPy數(shù)組創(chuàng)建對象(如 arange, ones, zeros以及其它)
  • 從磁盤中讀取標(biāo)準(zhǔn)或自定義格式的數(shù)據(jù)
  • 通過使用字符串或者緩沖區(qū),從原始的字節(jié)創(chuàng)建數(shù)組
  • 使用特殊的庫函數(shù)(比如random

本節(jié)不會涉及復(fù)制和連接等擴(kuò)展和轉(zhuǎn)換現(xiàn)有數(shù)組的方法,也不會涉及創(chuàng)建對象數(shù)組和結(jié)構(gòu)化數(shù)組。這些會在它們自己的章節(jié)中講述。

將Python類似數(shù)組的對象轉(zhuǎn)換為NumPy數(shù)組

通常,Python中排列為數(shù)組結(jié)構(gòu)的數(shù)值數(shù)據(jù)可以通過array()函數(shù)來轉(zhuǎn)換成數(shù)組,典型的例子就是列表和元組。具體使用方法請見array()函數(shù)的文檔。一些對象也支持?jǐn)?shù)組的協(xié)議,并且可以用這種方法轉(zhuǎn)換成數(shù)組。辨識一個對象是否能轉(zhuǎn)換為數(shù)組,最簡單的方法就是在交互式環(huán)境中嘗試這一方法,看看它是否有效(即Python之道)。

例如:

>>> x = np.array([2,3,1,0])
>>> x = np.array([2, 3, 1, 0])
>>> x = np.array([[1,2.0],[0,0],(1+1j,3.)]) # note mix of tuple and lists,
    and types
>>> x = np.array([[ 1.+0.j, 2.+0.j], [ 0.+0.j, 0.+0.j], [ 1.+1.j, 3.+0.j]])

內(nèi)置的NumPy數(shù)組創(chuàng)建

NumPy具有從無到有創(chuàng)建數(shù)組的內(nèi)置功能:

zeros(shape) 將創(chuàng)建一個填充為0的指定形狀的數(shù)組。

>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])

ones(shape) 將創(chuàng)建一個填充為1的數(shù)組。在其他所有方面都和zeros相同。

arange()將創(chuàng)建有規(guī)律的增量值數(shù)組。它的幾種用法請見docstring。這里給出幾個例子:

>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(2, 10, dtype=np.float)
array([ 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.arange(2, 3, 0.1)
array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])

請注意,關(guān)于最后一個用例,有一些使用技巧,請見arrange的docstring。

linspace()將以指定數(shù)量的元素創(chuàng)建數(shù)組,并平分開始值和結(jié)束值。例如:

>>> np.linspace(1., 4., 6)
array([ 1. ,  1.6,  2.2,  2.8,  3.4,  4. ])

這些創(chuàng)建函數(shù)的好處是,可以保證元素個數(shù)、起始點(diǎn)和結(jié)束點(diǎn),arange()一般不會指定任意的起始值、結(jié)束值和步長。

indices()將創(chuàng)建數(shù)組的集合(用一維數(shù)組來模擬高維數(shù)組),每一維都有表示它的變量。一個例子說明比口頭描述好得多:

>>> np.indices((3,3))
array([[[0, 0, 0], [1, 1, 1], [2, 2, 2]], [[0, 1, 2], [0, 1, 2], [0, 1, 2]]])

計(jì)算規(guī)則網(wǎng)格上的高維函數(shù)時,這會非常有用。

從磁盤讀取數(shù)組

這大概是大數(shù)組創(chuàng)建的最常見情況。當(dāng)然,細(xì)節(jié)取決于磁盤上的數(shù)據(jù)格式,所以這一節(jié)只能給出如何處理各種格式的一般建議。

標(biāo)準(zhǔn)二進(jìn)制格式

各個領(lǐng)域都有數(shù)組數(shù)據(jù)的標(biāo)準(zhǔn)格式。以下列出了用于讀取和返回NumPy數(shù)組的已知Python庫(也有其它的庫可以讀取數(shù)組并轉(zhuǎn)換為NumPy數(shù)組,所以也請看一下最后一節(jié))

HDF5: PyTables
FITS: PyFITS

一些格式不能直接讀取,但是不難將其轉(zhuǎn)換為類似PIL庫(能夠讀寫許多圖像格式,例如jpg、png以及其它)所支持的格式。

普通的ASCII格式

逗號分隔值文件(CSV)被廣泛使用(可以被類似Excel的一些程序?qū)雽?dǎo)出)。有一些在python中讀取這些文件的方法,例如Python和pylab(Matplotlib的一部分)中的函數(shù)。

更通用的ASCII文件可以使用SciPy的IO包來讀取。

自定義二進(jìn)制格式

有多種方法可以使用。如果文件有一個相對簡單的格式,那么你可以寫一個簡單的I/O庫并使用numpy fromfile()tofile()方法直接讀寫NumPy數(shù)組(注意字節(jié)順序!)。如果有一個不錯的C/C++庫可以用于讀取數(shù)據(jù),則可以用各種技巧把它封裝一下,雖然這可能要耗費(fèi)一些工作量,也需要更多高級的知識來和C/C++交互。

特殊庫的使用

有一些庫可以用于生成特殊用途的數(shù)組,這樣的庫不可能全部列舉出來。最常見的用法是使用許多數(shù)組生成函數(shù)來產(chǎn)生帶有隨機(jī)值的數(shù)組,以及使用一些生成特殊矩陣(如對角線)的功能函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容