譯者:飛龍
?
另見
導(dǎo)言
數(shù)組創(chuàng)建的一般機(jī)制有五種:
- 從其它Python的結(jié)構(gòu)轉(zhuǎn)換(如列表和元組)
- 內(nèi)置的NumPy數(shù)組創(chuàng)建對(duì)象(如
arange
,ones
,zeros
以及其它) - 從磁盤中讀取標(biāo)準(zhǔn)或自定義格式的數(shù)據(jù)
- 通過使用字符串或者緩沖區(qū)酣胀,從原始的字節(jié)創(chuàng)建數(shù)組
- 使用特殊的庫(kù)函數(shù)(比如
random
)
本節(jié)不會(huì)涉及復(fù)制和連接等擴(kuò)展和轉(zhuǎn)換現(xiàn)有數(shù)組的方法弄匕,也不會(huì)涉及創(chuàng)建對(duì)象數(shù)組和結(jié)構(gòu)化數(shù)組蝎土。這些會(huì)在它們自己的章節(jié)中講述岭洲。
將Python類似數(shù)組的對(duì)象轉(zhuǎn)換為NumPy數(shù)組
通常,Python中排列為數(shù)組結(jié)構(gòu)的數(shù)值數(shù)據(jù)可以通過array()
函數(shù)來轉(zhuǎn)換成數(shù)組逻翁,典型的例子就是列表和元組龙填。具體使用方法請(qǐng)見array()
函數(shù)的文檔。一些對(duì)象也支持?jǐn)?shù)組的協(xié)議尸曼,并且可以用這種方法轉(zhuǎn)換成數(shù)組们何。辨識(shí)一個(gè)對(duì)象是否能轉(zhuǎn)換為數(shù)組,最簡(jiǎn)單的方法就是在交互式環(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)建一個(gè)填充為0的指定形狀的數(shù)組。
>>> np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]])
ones(shape)
將創(chuàng)建一個(gè)填充為1的數(shù)組茬射。在其他所有方面都和zeros
相同鹦蠕。
arange()
將創(chuàng)建有規(guī)律的增量值數(shù)組。它的幾種用法請(qǐng)見docstring在抛。這里給出幾個(gè)例子:
>>> 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])
請(qǐng)注意钟病,關(guān)于最后一個(gè)用例,有一些使用技巧霜定,請(qǐng)見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ù)的好處是作煌,可以保證元素個(gè)數(shù)、起始點(diǎn)和結(jié)束點(diǎn)汹押,arange()
一般不會(huì)指定任意的起始值剂公、結(jié)束值和步長(zhǎng)。
indices()
將創(chuàng)建數(shù)組的集合(用一維數(shù)組來模擬高維數(shù)組)典挑,每一維都有表示它的變量酥宴。一個(gè)例子說明比口頭描述好得多:
>>> 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í),這會(huì)非常有用您觉。
從磁盤讀取數(shù)組
這大概是大數(shù)組創(chuàng)建的最常見情況拙寡。當(dāng)然,細(xì)節(jié)取決于磁盤上的數(shù)據(jù)格式琳水,所以這一節(jié)只能給出如何處理各種格式的一般建議肆糕。
標(biāo)準(zhǔn)二進(jìn)制格式
各個(gè)領(lǐng)域都有數(shù)組數(shù)據(jù)的標(biāo)準(zhǔn)格式。以下列出了用于讀取和返回NumPy數(shù)組的已知Python庫(kù)(也有其它的庫(kù)可以讀取數(shù)組并轉(zhuǎn)換為NumPy數(shù)組在孝,所以也請(qǐng)看一下最后一節(jié))
HDF5: PyTables
FITS: PyFITS
一些格式不能直接讀取诚啃,但是不難將其轉(zhuǎn)換為類似PIL庫(kù)(能夠讀寫許多圖像格式,例如jpg私沮、png以及其它)所支持的格式始赎。
普通的ASCII格式
逗號(hào)分隔值文件(CSV)被廣泛使用(可以被類似Excel的一些程序?qū)雽?dǎo)出)。有一些在python中讀取這些文件的方法,例如Python和pylab(Matplotlib的一部分)中的函數(shù)造垛。
更通用的ASCII文件可以使用SciPy的IO包來讀取魔招。
自定義二進(jìn)制格式
有多種方法可以使用。如果文件有一個(gè)相對(duì)簡(jiǎn)單的格式筋搏,那么你可以寫一個(gè)簡(jiǎn)單的I/O庫(kù)并使用numpy fromfile()
和tofile()
方法直接讀寫NumPy數(shù)組(注意字節(jié)順序F桶佟)。如果有一個(gè)不錯(cuò)的C/C++庫(kù)可以用于讀取數(shù)據(jù)奔脐,則可以用各種技巧把它封裝一下俄周,雖然這可能要耗費(fèi)一些工作量,也需要更多高級(jí)的知識(shí)來和C/C++交互髓迎。
特殊庫(kù)的使用
有一些庫(kù)可以用于生成特殊用途的數(shù)組峦朗,這樣的庫(kù)不可能全部列舉出來。最常見的用法是使用許多數(shù)組生成函數(shù)來產(chǎn)生帶有隨機(jī)值的數(shù)組排龄,以及使用一些生成特殊矩陣(如對(duì)角線)的功能函數(shù)波势。