【问题标题】:Error: Setting an array element with a sequence. Python / Numpy错误:使用序列设置数组元素。蟒蛇/麻木
【发布时间】:2014-03-15 05:23:33
【问题描述】:

我在尝试将数组分配给另一个数组特定位置时收到此错误。 在创建简单列表并进行此类分配之前,我正在这样做。但是 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,但我不知道这样做是否会失去性能。

谢谢。

【问题讨论】:

  • 收到什么错误?提供完整的追溯。

标签: python arrays numpy


【解决方案1】:

问题是 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]])

【讨论】:

  • 是的,我知道。但我认为这样做会损失很多性能。
【解决方案2】:

您可以在数组中添加另一个大小为 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
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 2016-10-30
  • 2018-09-01
  • 2016-01-01
  • 2015-08-10
相关资源
最近更新 更多