使用高级索引进行广播分配

时间:2018-02-08 11:33:57

标签: python numpy

关注这项任务,我的头脑没有按预期行事:

a = np.arange(24).reshape(4,3,2)
b = np.array([-1,-2,-3])
c = np.array([1])
a[...,c] = b
=> ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (1,4,3)

我期待

  1. 索引结果形状为(4,3,1)而不是(1,4,3)和
  2. (3,)的右侧形状实际上可以播放到(1,4,3)?
  3. 我在这里遗漏了什么吗?

2 个答案:

答案 0 :(得分:2)

这应该有效。使用[:, None]建立索引会更改数组的方向。

a[...,c] = b[:, None]

答案 1 :(得分:1)

你的第一个期望是真的。如果您尝试a[...,c].shape则为4,3,1。不确定为什么错误说1,3,4。

对于第二个期望,您将大小为3的向量(1D)分配给3-D矩阵(4,3,1)。要做到这一点,你需要使矢量b 2-D形状(3,1)。这可以做到:

a[...,c] = b[None].T

请参阅Numpy broadcasting