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

pce*_*con 11 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]])
Run Code Online (Sandbox Code Playgroud)

会发生什么'因为我有一个定义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))
Run Code Online (Sandbox Code Playgroud)

在一个特定的方法中,我必须计算这个数据的梯度,这是一个2 x 2矩阵(原因我想使用ndarray,而不是一个简单的数组),为此,我创建了另一个实例此对象存储此新数据,其中每个点(像素)应存储其渐变.我使用的是简单的列表,但是我可以通过numpy获得一些性能.

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

谢谢.

tin*_*ike 18

麻烦的是matrix_b默认为float dtype.在我的机器上,检查

matrix_b.dtype
Run Code Online (Sandbox Code Playgroud)

回报dtype('float64').要创建一个可以容纳任何东西的numpy数组,可以手动将dtype设置为object,这样就可以在其中放置一个矩阵:

matrix_b = np.zeros((rows, cols), dtype=object)
matrix_b[0, 0] = np.matrix([[0], [0], [1]])
Run Code Online (Sandbox Code Playgroud)


M4r*_*ini 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 
Run Code Online (Sandbox Code Playgroud)

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

matrix_b = np.zeros((rows, cols), dtype=list) 
matrix_b[0, 0] = [0, 0, 1]
Run Code Online (Sandbox Code Playgroud)