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

簡(jiǎn)介

創(chuàng)建數(shù)組有5種常規(guī)機(jī)制:

  1. 從其他Python結(jié)構(gòu)(例如,列表,元組)轉(zhuǎn)換
  2. numpy原生數(shù)組的創(chuàng)建(例如,arange、ones、zeros等)
  3. 從磁盤(pán)讀取數(shù)組,無(wú)論是標(biāo)準(zhǔn)格式還是自定義格式
  4. 通過(guò)使用字符串或緩沖區(qū)從原始字節(jié)創(chuàng)建數(shù)組
  5. 使用特殊庫(kù)函數(shù)(例如,random)

本節(jié)不包括復(fù)制,連接或以其他方式擴(kuò)展或改變現(xiàn)有數(shù)組的方法。它也不會(huì)涵蓋創(chuàng)建對(duì)象數(shù)組或結(jié)構(gòu)化數(shù)組。這些都包含在他們自己的章節(jié)中。

將Python array_like對(duì)象轉(zhuǎn)換為Numpy數(shù)組

通常,在Python中排列成array-like結(jié)構(gòu)的數(shù)值數(shù)據(jù)可以通過(guò)使用array()函數(shù)轉(zhuǎn)換為數(shù)組。最明顯的例子是列表和元組。有關(guān)其使用的詳細(xì)信息,請(qǐng)參閱array()的文檔。一些對(duì)象可能支持?jǐn)?shù)組協(xié)議并允許以這種方式轉(zhuǎn)換為數(shù)組。找出對(duì)象是否可以使用array()轉(zhuǎn)換為一個(gè)數(shù)組numpy 數(shù)組的簡(jiǎn)單方法很簡(jiǎn)單,只要交互式試一下,看看它是否工作?。≒ython方式)。

例子:

>>> 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]])

Numpy原生數(shù)組的創(chuàng)建

Numpy內(nèi)置了從頭開(kāi)始創(chuàng)建數(shù)組的函數(shù):

zeros(shape)將創(chuàng)建一個(gè)用指定形狀用0填充的數(shù)組。默認(rèn)的dtype是float64。

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

ones(shape)將創(chuàng)建一個(gè)用1個(gè)值填充的數(shù)組。它在所有其他方面與zeros相同。

arange()將創(chuàng)建具有有規(guī)律遞增值的數(shù)組。檢查文檔字符串以獲取有關(guān)可以使用的各種方式的完整信息。這里給出幾個(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)于用戶應(yīng)該注意的最后用法在arange文檔字符串中有一些細(xì)微的描述。

linspace() 將創(chuàng)建具有指定數(shù)量元素的數(shù)組,并在指定的開(kāi)始值和結(jié)束值之間平均間隔。例如:

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

這個(gè)創(chuàng)建函數(shù)的優(yōu)點(diǎn)是可以保證元素的數(shù)量以及開(kāi)始和結(jié)束點(diǎn),對(duì)于任意的開(kāi)始,停止和步驟值,arange()通常不會(huì)這樣做。

indices() 將創(chuàng)建一組數(shù)組(堆積為一個(gè)更高維的數(shù)組),每個(gè)維度一個(gè),每個(gè)維度表示該維度中的變化。一個(gè)例子說(shuō)明比口頭描述要好得多:

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

這對(duì)于評(píng)估常規(guī)網(wǎng)格上多個(gè)維度的功能特別有用。

從磁盤(pán)讀取數(shù)組

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

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

各種字段都有數(shù)組數(shù)據(jù)的標(biāo)準(zhǔn)格式。下面列出了那些已知的Python庫(kù)來(lái)讀取它們并返回numpy數(shù)組(可能有其他可能讀取并轉(zhuǎn)換為numpy數(shù)組的其他數(shù)據(jù),因此請(qǐng)檢查最后一節(jié))

HDF5: h5py
FITS: Astropy

無(wú)法直接讀取但不易轉(zhuǎn)換的格式示例是像PIL這樣的庫(kù)支持的格式(能夠讀取和寫(xiě)入許多圖像格式,如jpg,png等)。

常見(jiàn)ASCII格式

逗號(hào)分隔值文件(CSV)被廣泛使用(以及Excel等程序的導(dǎo)出和導(dǎo)入選項(xiàng))。有很多方法可以在Python中閱讀這些文件。python中有CSV函數(shù)和pylab函數(shù)(matplotlib的一部分)。

更多通用的ascii文件可以在scipy中使用io軟件包讀取。

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

有各種各樣的方法可以使用。如果文件具有相對(duì)簡(jiǎn)單的格式,那么可以編寫(xiě)一個(gè)簡(jiǎn)單的 I/O 庫(kù),并使用 numpy fromfile() 函數(shù)和 .tofile() 方法直接讀取和寫(xiě)入numpy數(shù)組(盡管介意你的字節(jié)序)!如果存在一個(gè)讀取數(shù)據(jù)的良好 C 或 C++ 庫(kù),可以使用各種技術(shù)來(lái)封裝該庫(kù),但這肯定要做得更多,并且需要更多的高級(jí)知識(shí)才能與C或C++ 接口。

使用特殊庫(kù)

有些庫(kù)可用于生成特殊用途的數(shù)組,且無(wú)法列出所有的這些庫(kù)。最常見(jiàn)的用途是隨機(jī)使用許多數(shù)組生成函數(shù),這些函數(shù)可以生成隨機(jī)值數(shù)組,以及一些實(shí)用函數(shù)來(lái)生成特殊矩陣(例如對(duì)角線)。

作者:柯廣的網(wǎng)絡(luò)日志 ? 創(chuàng)建數(shù)組


微信公眾號(hào):Java大數(shù)據(jù)與數(shù)據(jù)倉(cāng)庫(kù)