通过.整形(生成器)将一维阵列广播到变化nD阵列的特定维数

2024-09-30 04:33:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大矩阵的形状(2,2,2,…n)的钕维,这往往是不同的。你知道吗

不过,我也收到了传入的数据,这总是一个1D数组的形状(2,)。你知道吗

现在我想用我的一维数组乘以我以前的一维矩阵,通过重塑。。。我还有一个“索引”,我特别想广播和修改它的维度。你知道吗

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

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

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

例如,如果我们有一个5D矩阵的形状(2,2,2,2,2),索引为3,我们会想重塑1D数组的形状(1,1,1,2,1)。你知道吗

有什么想法吗?你知道吗

提前谢谢。你知道吗

编辑:

所以我的整个方法都是错的: 得到我想要的元组似乎仍然将(2,)1D数组传播到所有维度。你知道吗

例如: (2,2,2)的numpy数组test_nd.shape,如下所示:

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

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

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

它似乎一直在向全方位传播。有什么想法吗?你知道吗


Tags: 数据testnumpyif矩阵数组arraymatrix
2条回答

一种方法是排列轴。因此,我们可以将相关轴从matrix_nd推到最后,让它与1D数组相乘,最后将轴置换回来。因此,对于给定的axis,在matrix_nd中,我们需要将1D数组相乘,它将是-

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)

相关问题 更多 >

    热门问题