尝试将数组分配给另一个阵列特定位置时,我收到此错误。 我在创建简单列表和执行此类任务之前就这样做了。但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 ,但我不知道我是否会因此而失去性能。
谢谢。
答案 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]