【问题标题】:NumPy: Assigning to Matrix using Slice Indices vs ListsNumPy:使用切片索引与列表分配给矩阵
【发布时间】:2012-09-15 01:29:30
【问题描述】:

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

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):

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.]])

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

(编辑:错字)

【问题讨论】:

    标签: python numpy scipy slice


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      这意味着当你像这样设置元素时,它总是表现得像:

      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),在这种情况下可以说因为它只是删除了 1右侧 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]]) 有效,因为在分配之前矩阵被固定为 2-D(我知道它不再就地,所以废话,但它证明了这一点)。
      • matrix 有一个自定义的__getitem__ 来处理(大部分)这个问题。但这是__setitem__,它的行为与数组完全相同。
      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 2015-06-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多