2014-08-28 27 views
0

我試圖初始化一個包含命名元組的NumPy數組。當我用empty數據初始化數組並且事後設置了數據時,一切正常;但是,當使用numpy.array構造函數時,NumPy並沒有達到我的預期。使用命名元組初始化numpy數組

import numpy 

data = numpy.random.rand(10, 3) 
print data[0] 

# Works 
a = numpy.empty(
    len(data), 
    dtype=numpy.dtype([('nodes', (float, 3))]) 
    ) 
a['nodes'] = data 
print 
print a[0]['nodes'] 


# Doesn't work 
b = numpy.array(
    data, 
    dtype=numpy.dtype([('nodes', (float, 3))]) 
    ) 
print 
print b[0]['nodes'] 

輸出是

[ 0.28711363 0.89643579 0.82386232] 

[ 0.28711363 0.89643579 0.82386232] 

[[ 0.28711363 0.28711363 0.28711363] 
[ 0.89643579 0.89643579 0.89643579] 
[ 0.82386232 0.82386232 0.82386232]] 

這與NumPy的1.8.1。

有關如何組織array構造函數的任何提示?

回答

0

這是可怕的,但:

開始你的榜樣複製並粘貼到IPython中,嘗試

dtype=numpy.dtype([('nodes', (float, 3))]) 
c = numpy.array([(aa,) for aa in data], dtype=dtype) 

似乎這樣的伎倆。

+0

這麼說,我使用'empty'還會讀取作爲一個迭代的數據認爲的選項。所以它可能不會好多了。主要的問題是,如果人們也不能這樣做,那麼人們會希望這樣做。 – eickenberg 2014-08-28 18:31:16

+0

基本的觀點是,像這樣'dtype',數組元素是'tuples'。 'a [1]'返回一個「元組」。所以要設置整個數組,你必須使用元組列表。 'a [:] = [(x,)for x in data]'也適用。 – hpaulj 2014-08-28 22:18:24

+0

是的,這是OP的第一選擇。它被認爲是可行的 - 即使數據數組可能是作爲迭代器讀入的(而不是100%確定)。所以在這種情況下,轉換爲元組甚至不是必需的。問題是關於如何使用numpy數組構造函數來做同樣的事情 – eickenberg 2014-08-29 06:20:53

-1

這是有益的構造不同的數組:

dt3=np.dtype([('x','<f8'),('y','<f8'),('z','<f8')]) 
b=np.zeros((10,),dtype=dt3) 
b[:]=[tuple(x) for x in data] 
b['x'] = data[:,0] # alt 
np.array([tuple(x) for x in data],dtype=dt3) # or in one statement 

a[:1] 
# array([([0.32726803375966484, 0.5845638956708634, 0.894278688117277],)], dtype=[('nodes', '<f8', (3,))]) 
b[:1] 
# array([(0.32726803375966484, 0.5845638956708634, 0.894278688117277)], dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')]) 

我不認爲有沒有某種形式的迭代分配datab所有字段的方式。


genfromtxt是生成像這樣的記錄數組的常用方法。看着它的代碼,我看到這樣一個規律:

data = list(zip(*[...])) 
output = np.array(data, dtype) 

啓發了我嘗試:

dtype=numpy.dtype([('nodes', (float, 3))]) 
a = np.array(zip(data), dtype=dtype) 

(速度是基本相同eickenberg的理解,所以它做同樣的純Python的列表操作)

而對於3個字段:

np.array(zip(*data.T), dtype=dt3) 

奇怪的是,明確地轉換列出首先是速度更快(幾乎2倍的zip(data)計算)

np.array(zip(*data.T.tolist()), dtype=dt3) 
+0

在這種情況下,作爲'recarray'' – eickenberg 2014-08-29 14:43:15

+0

'zip(data)'做一個更緊湊的表達式可能會讓整個事情變得有趣。 – hpaulj 2014-08-29 21:55:24