譯者:飛龍
?
另見
導(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ù)。