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)
您可以向数组添加另一个大小为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)