0

鉴于以下代码,我希望最后两行的行为相同,但事实并非如此。

import numpy as np

C = np.matrix(np.zeros((4,4)))
C[0, 0:2] = np.matrix([[1, 2]]) # Works as expected.
C[0, [0,1]] = np.matrix([[1, 2]]) # Throws an "array is not broadcastable to correct shape" error.

相反,当使用 an 时ndarray,事情会按预期工作(将分配的右侧调整为一维ndarray):

D = np.zeros((4,4))
D[0, 0:2] = np.array([1, 2]) # Works as expected.
D[0, [0,1]] = np.array([1, 2]) # Works too.

更奇怪的是,如果一个人只是索引矩阵C(而不是分配给它),似乎使用切片索引或列表只是返回相同的:

C[0, 0:2] # => matrix([[ 1.,  2.]])
C[0, [0, 1]] # => matrix([[ 1.,  2.]])

问题是,为什么这两种分配方法的行为不同?我错过了什么?

(编辑:错字)

4

2 回答 2

2

它似乎是 numpy 中的一个错误:http ://projects.scipy.org/numpy/ticket/803 。解决方案是分配一个普通的列表或 numpy 数组,而不是为选定的元素分配一个矩阵。

于 2012-09-23T08:02:24.493 回答
-1

编辑:必须意识到,虽然我写的是真实的,但D[0,0:2] = ...与(因此对于数组)不同的事实D[0,[0,1]] = ...可能是真正的不一致(并且相关)。

据我所知,也许这是为什么会发生这种情况的解释。检查这个:

D[0,[0,1]] = np.array([[1,2]])

给出同样的错误。问题是在内部切片操作发生在矩阵形状再次“固定”为 2D 之前,这是因为matrix每当创建新视图时都会出现子类,但这里没有创建视图,因为它通常是不必要的!

这意味着当您像这样设置元素时,它的行为总是如下:

C.A[0,[0,1]] = matrix([[1,2]])  # Note the C.A giving normal array view of C.

失败了,因为矩阵是二维的,但是C.A[0,[0,1]]是一维的(因为它没有被矩阵对象“固定”为至少是二维的),在这种情况下,可以说因为它只是从右手移除了一维轴侧 numpy 可能会容忍它,但只要它不容忍它,它就需要矩阵对象制作完整的自定义集合/分配运算符,这可能也不是很优雅。

但也许使用C.A等可以帮助解决这个不便。然而,一般来说,在 numpy 中最好始终使用基类数组,除非您正在进行大量矩阵乘法等(在这种情况下,如果它仅限于程序的一部分,最好只查看您的数组在它之前作为矩阵,但在其余部分使用数组)

于 2012-09-23T09:00:48.457 回答