【问题标题】:Broadcasting a 1D array to a particular dimension of a varying nD array via .reshape(generator)通过 .reshape(generator) 将一维数组广播到不同 nD 数组的特定维度
【发布时间】:2020-03-17 15:51:47
【问题描述】:

我有一个 nD 维度的形状 (2,2,2,...n) 的大矩阵,它经常变化。

但是,我也收到了始终是形状 (2,) 的一维数组的传入数据。

现在我想通过重塑将我以前的 nD 维度矩阵与我的 1D 数组相乘......而且我还有一个“索引”,我想特别广播和修改哪些维度。

因此,我正在执行以下操作(在循环中):

matrix_nd *= array_1d.reshape(1 if i!=index else dimension for i, dimension in enumerate(matrix_nd.shape))

但是,这个生成器作为输入似乎无效。 请注意,维度始终等于 2,并且仅在我们的序列中放置一次。

例如,如果我们有一个形状为 (2,2,2,2,2) 且索引为 3 的 5D 矩阵;我们希望将一维数组重塑为 (1,1,1,2,1)。

有什么想法吗?

提前致谢。

编辑:

所以事实证明我的整个方法都是错误的: 获得我想要的元组似乎仍然将 (2,) 一维数组广播到所有维度。

例如: 我有 (2,2,2) 的 numpy 数组 test_nd.shape,它看起来像这样:

array([[[1, 1],
  [1, 1]],
 [[1, 1],
  [1, 1]]])

然后我重塑一个 (2,) 一维数组,仅广播到第三维:

toBroadcast = numpy.asarray([0,0]).reshape(1,1,2)

toBroadcast 的格式为array([[[0, 0]]])

但是...test_nd*toBroadcast 返回以下结果:

array([[[0, 0],
      [0, 0]],
     [[0, 0],
      [0, 0]]])

它似乎一直在向所有维度广播。有什么想法吗?

【问题讨论】:

  • 您需要将test_nd 与一个随机值一起使用,而不是所有 1 以及类似的其他一维数组的随机值,然后向我们展示您的期望。目前还不清楚。

标签: python numpy reshape numpy-ndarray array-broadcasting


【解决方案1】:

你可以定义一个类似的函数

def broadcast_axis(data, ndims, axis):
    newshape = [1] * ndims
    newshape[axis] = -1
    return data.reshape(*newshape)

并像使用它

vector = broadcast_axis(vector, matrix.ndim, 3)

【讨论】:

  • 感谢您的解决方案。对于后面的 sn-p 代码,我认为它应该是 matrix.ndim :)
【解决方案2】:

一种方法是置换轴。因此,我们可以将相关轴从matrix_nd 推到最后,让它与一维数组相乘,最后重新排列轴。因此,在给定axis 的情况下,在matrix_nd 中,我们需要乘以一维数组,它将是 -

np.moveaxis(np.moveaxis(matrix_nd,axis,-1)*array_1d,-1,axis)

同样,我们不需要将一维数组重新整形为(1,1,1,2,1)。我们可以将其重塑为相关轴,即(2,1)broadcasting 仍然可以工作,因为引导轴是自动广播的。因此,另一种方法是 -

matrix_nd*array_1d.reshape((-1,)+(1,)*(matrix_nd.ndim-axis-1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2013-09-27
    相关资源
    最近更新 更多