通过.reshape(generator)将1D数组广播到变化的nD数组的特定尺寸

问题描述 投票:0回答:2

我有一个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,2)且索引为3的5D矩阵;我们想将一维数组重塑为(1,1,1,2,1)。

有什么想法吗?

提前感谢。

python numpy reshape numpy-ndarray numpy-broadcasting
2个回答
0
投票

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

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

同样,我们不需要将1D数组的形状重塑为(1,1,1,2,1)。我们可以将其调整为仅相关轴的形状,即(2,1)broadcasting仍然有效,因为引导轴是自动广播的。因此,另一种方式是-

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

0
投票

您可以定义类似的功能

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

并像这样使用

vector = broadcast_axis(vector, matrix.ndim, 3)
© www.soinside.com 2019 - 2024. All rights reserved.