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

11
我在尝试将一个数组分配给另一个特定位置的数组时,遇到了这个错误。在创建简单列表并进行此类赋值之前,我一直在这样做。但是Numpy比简单列表更快,所以我现在想使用它。
问题是因为我有一个存储某些数据的二维数组,在我的代码中,例如,我需要计算每个位置值的梯度,因此我创建另一个二维数组,其中每个位置存储其值的梯度。
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))

在一种特定的方法中,我需要计算这个数据的梯度,它是一个2x2的矩阵(因此我想使用ndarray而不是简单的array),为了做到这一点,我创建了另一个该对象的实例来存储这些新数据,其中每个点(像素)应该存储它的梯度。我一直在使用简单的列表,这样可以工作,但我认为我可以通过numpy获得更好的性能。有没有办法解决这个问题?或者更好的做法?我知道可以将数组类型定义为object,但我不知道这样做是否会降低性能。谢谢。

2
收到了什么错误?请提供完整的回溯信息。 - jonrsharpe
2个回答

21

问题在于matrix_b默认为float数据类型。在我的机器上检查。

matrix_b.dtype

返回dtype('float64')。为了创建一个可以容纳任何东西的numpy数组,您可以手动将dtype设置为object,这将允许您将矩阵放入其中:

返回dtype('float64')。要创建能够容纳任何内容的NumPy数组,您可以手动将dtype设置为object,这样就可以在其中放置矩阵:

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

1
是的,我知道。但我认为这样做会损失很多性能。 - pceccon

8
你可以为数组添加另一个尺寸,其大小为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]

谢谢。我只是不知道这是否是更好的解决方案。我想我必须改变所有的代码,这可能会让它难以阅读。:S - pceccon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接