2014-02-15 56 views
10

我在嘗試將數組分配給另一個數組特定位置時收到此錯誤。 我在創建簡單列表並進行此類分配之前正在執行此操作。但是Numpy比簡單的列表更快,我現在正在嘗試使用它。錯誤:使用序列設置數組元素。 Python/Numpy

問題是因爲我有一個二維數組,存儲一些數據,並在我的代碼中,例如,爲每個位置值計算漸變,所以我創建了另一個2D數組,其中每個位置存儲了漸變它的價值。

import numpy as np 

cols = 2 
rows = 3 

# This works 
matrix_a = [] 

for i in range(rows): 
    matrix_a.append([0.0] * cols) 

print matrix_a  
matrix_a[0][0] = np.matrix([[0], [0]])  
print matrix_a 

# This doesn't work 
matrix_b = np.zeros((rows, cols)) 
print matrix_b 

matrix_b[0, 0] = np.matrix([[0], [0]]) 

會發生什麼情況是因爲我有一個類定義np.zeros((行,COLS))對象,存儲有關的一些數據信息,從而簡化了,例如,圖像數據。

class Data2D(object): 
    def __init__(self, rows=200, cols=300): 
     self.cols = cols 
     self.rows = rows 
     # The 2D data structure 
     self.data = np.zeros((rows, cols)) 

在一個具體的方法中,我必須計算梯度此數據,這是一個2×2矩陣(這導致我想用ndarray,而不是一個簡單的陣列) ,爲此,我創建了此對象的另一個實例來存儲此新數據,其中每個點(像素)應存儲其漸變。我使用的是簡單的列表,雖然可行,但我可以通過numpy獲得一些性能。

有辦法解決這個問題嗎?或者更好的方式來做這樣的事情? 我知道我可以將數組類型定義爲對象,但我不知道我是否失去了做這種事情的表現。

謝謝。

+2

Receive * what * error?提供完整的追溯。 – jonrsharpe

回答

17

麻煩的是,matrix_b默認爲float dtype。在我的機器上,檢查

matrix_b.dtype 

返回dtype('float64')。要創建一個可容納任何東西的numpy數組,您可以手動將dtype設置爲object,這將允許您在其中放置一個矩陣:

matrix_b = np.zeros((rows, cols), dtype=object) 
matrix_b[0, 0] = np.matrix([[0], [0], [1]]) 
+1

是的,我知道。但是,儘管如此,我會失去很多表現。 – pceccon

7

您可以將另一個尺寸爲3的維添加到您的陣列中。

import numpy as np 

cols = 2 
rows = 3 
matrix_b = np.zeros((rows, cols, 3)) 
matrix_b[0, 0] = np.array([0, 0, 1]) 
matrix_b[0, 0] = [0, 0, 1] #This also works 

另一個選擇是到D型設置爲list,然後你可以設置每個元素的列表。但這並不是真正的建議,因爲這樣做會大大降低numpy的速度表現。

matrix_b = np.zeros((rows, cols), dtype=list) 
matrix_b[0, 0] = [0, 0, 1] 
+0

謝謝。我只是不知道這是否是更好的解決方案。我想我將不得不改變我的所有代碼,它可能會變得不可讀。 :S – pceccon

相關問題