我有一个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)。
有什么想法吗?
提前感谢。
一种方法是排列轴。因此,我们可以将相关轴从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))
您可以定义类似的功能
def broadcast_axis(data, ndims, axis):
newshape = [1] * ndims
newshape[axis] = -1
return data.reshape(*newshape)
并像这样使用
vector = broadcast_axis(vector, matrix.ndim, 3)