Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NumPy:使用切片索引与列表分配给矩阵_Python_Numpy_Scipy_Slice - Fatal编程技术网

Python NumPy:使用切片索引与列表分配给矩阵

Python NumPy:使用切片索引与列表分配给矩阵,python,numpy,scipy,slice,Python,Numpy,Scipy,Slice,给定下面的代码,我希望最后两行的行为相同,但实际情况并非如此 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. 当改用ndarray时,一切正

给定下面的代码,我希望最后两行的行为相同,但实际情况并非如此

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.
当改用
ndarray
时,一切正常(将赋值的右侧调整为一维
ndarray
):

更奇怪的是,如果只为矩阵
C
编制索引(而不是分配给它),那么使用切片索引或列表似乎只会返回相同的结果:

C[0, 0:2] # => matrix([[ 1.,  2.]])
C[0, [0, 1]] # => matrix([[ 1.,  2.]])
问题是,为什么这两种方法在作业中的行为不同?我错过了什么


(编辑:打字错误)

这似乎是numpy中的一个错误:。解决方案是分配一个普通的列表或numpy数组,而不是给选定的元素分配一个矩阵。

Edit:必须意识到,虽然我写的是真的,但是
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.
它失败了,因为矩阵是2D,但C.A[0,[0,1]]是1D(因为矩阵对象并没有将其“固定”为至少2D),在这种情况下,可以说,因为它只是从右侧numpy移除一个一维轴,可能可以容忍它,但只要不这样做,它就需要矩阵对象生成一个完整的自定义就地/赋值操作符集,这可能不是很简单


但是,也许使用
C.A
等可以帮助避免这种不便。但是,总的来说,在numpy中,最好始终使用基类数组,除非您要执行大量矩阵乘法等操作(在这种情况下,如果它仅限于程序的一部分,则最好只将数组视为它前面的矩阵,而在其余部分使用数组)

D[0,0,1]=np.array([[1,2]])
失败,因为切片二维
ndarray
会得到一个一维
ndarray
(在本例中),右侧是二维。当然,但实际上是1
D[0,0:1]=np.array([[1,2]])
的工作原理是,切片允许更多的索引。问题是,矩阵也是如此。对于这个赋值本身,它不是二维的。请注意
C[0[0,1][…]=np.array([[1,2]])
是有效的,因为在赋值之前矩阵是固定在二维的(我知道它已经不存在了,毫无意义,但它证明了这一点)。
矩阵
有一个自定义的
\uu getitem\uuuuuuu
来处理(大部分)这一点。但这是
\uuuu setitem\uuuuuu
,其行为与数组完全相同。
C.A[0,[0,1]] = matrix([[1,2]])  # Note the C.A giving normal array view of C.