错误:使用序列设置数组元素。 Python / Numpy

时间:2014-02-15 20:31:05

标签: python arrays numpy

尝试将数组分配给另一个阵列特定位置时,我收到此错误。 我在创建简单列表和执行此类任务之前就这样做了。但Numpy比简单列表更快,我现在正试图使用​​它。

问题是因为我有一个存储一些数据的2D数组,并且在我的代码中,我有例如计算每个位置值的渐变,所以我创建另一个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((rows,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 x 2矩阵(原因我想使用 ndarray ,而不是简单的数组),为此,我创建了这个对象的另一个实例来存储这个新数据,其中每个点(像素)应该存储它的渐变。我使用的是简单的列表,但是我可以通过numpy获得一些性能。

有办法解决这个问题吗?或者更好的方法来做这样的事情? 我知道我可以将数组类型定义为 object ,但我不知道我是否会因此而失去性能。

谢谢。

2 个答案:

答案 0 :(得分:18)

麻烦的是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 :(得分: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 

另一种选择是将dtype设置为list,然后您可以将每个元素设置为列表。但这并不是真的值得推荐,因为这样做会让你失去很多numpy的速度性能。

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