2011-09-27 103 views
1

我正在嘗試將代碼分配給numpy中的結構化數組的簡單行,我並不確定,但是當我將矩陣分配給我創建的結構化數組中的一個sub_array時發生了錯誤如下:指定numpy結構數組的問題

new_type = np.dtype('a3,(2,2)u2') 
x = np.zeros(5,dtype=new_type) 
x[1]['f1'] = np.array([[1,1],[1,1]]) 
print x 
Out[143]: 
array([('', [[0, 0], [0, 0]]), ('', [[1, 0], [0, 0]]), 
    ('', [[0, 0], [0, 0]]), ('', [[0, 0], [0, 0]]), 
    ('', [[0, 0], [0, 0]])], 
    dtype=[('f0', '|S3'), ('f1', '<u2', (2, 2))]) 

應該不是子陣列的第二場等於在這個階段

[[1,1],[1,1]] 
+1

10個問題 - 0接受的答案。只是說... – JoshAdel

回答

1

我想你想設置的事情略有不同。嘗試:

x['f1'][1] = np.array([[1,1],[1,1]]) 

導致:

In [43]: x = np.zeros(5,dtype=new_type) 

In [44]: x['f1'][1] = np.array([[1,1],[1,1]]) 

In [45]: x 
Out[45]: 
array([('', [[0, 0], [0, 0]]), ('', [[1, 1], [1, 1]]), 
     ('', [[0, 0], [0, 0]]), ('', [[0, 0], [0, 0]]), 
     ('', [[0, 0], [0, 0]])], 
     dtype=[('f0', '|S3'), ('f1', '<u2', (2, 2))]) 

這並不是說這是不奇怪的現象,雖然因爲兩個x['f1'][1]x[1]['f1']打印相同的結果,但顯然是不同的:

In [51]: x['f1'][1] 
Out[51]: 
array([[1, 1], 
     [1, 1]], dtype=uint16) 

In [52]: x[1]['f1'] 
Out[52]: 
array([[1, 1], 
     [1, 1]], dtype=uint16) 

In [53]: x[1]['f1'] = 2 

In [54]: x 
Out[54]: 
array([('', [[0, 0], [0, 0]]), ('', [[2, 1], [1, 1]]), 
     ('', [[0, 0], [0, 0]]), ('', [[0, 0], [0, 0]]), 
     ('', [[0, 0], [0, 0]])], 
     dtype=[('f0', '|S3'), ('f1', '<u2', (2, 2))]) 

In [55]: x['f1'][1] = 3 

In [56]: x 
Out[56]: 
array([('', [[0, 0], [0, 0]]), ('', [[3, 3], [3, 3]]), 
     ('', [[0, 0], [0, 0]]), ('', [[0, 0], [0, 0]]), 
     ('', [[0, 0], [0, 0]])], 
     dtype=[('f0', '|S3'), ('f1', '<u2', (2, 2))]) 

我不得不多想一些,弄清楚到底發生了什麼。

+0

感謝您的迴應,我不會想到這一點,是的,這似乎是一個奇怪的行爲,如你所說。 – JustInTime

+1

@JustInTime - 請接受這個答案(以及其他問題)。 – eumiro

+0

我剛碰到這個問題,也發現了這個解決方法。基本問題似乎是以單向的方式產生副本,另一方面則是一種觀點。不過,除了嘗試之外,我還不清楚你應該怎麼知道。我在這裏找到了更多信息:https://stackoverflow.com/questions/3058602/python-numpy-structured-array-recarray-assigning-values-into-slices – Chris