填充 numpy 数组的指定维度

Filling across a specified dimension of a numpy array

我有一个相对常见的情况,我需要填充数组的给定维度。例如,如果我有一个数组:

example_array = np.zeros((2,3,4), dtype=bool)
example_array[:, 1, [1,3]] = True

然后有内容:

array([[[False, False, False, False],
        [False,  True, False,  True],
        [False, False, False, False]],

       [[False, False, False, False],
        [False,  True, False,  True],
        [False, False, False, False]]])

我想在给定维度上填充内容 - 例如,如果我想在维度 1 上填充,我可以这样做:

output = np.cumsum(example_array, axis=1, dtype=bool)
output = np.cumsum(output[:, ::-1, :], axis=1, dtype=bool)

给我想要的输出:

array([[[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]]])

有没有人有 neater/more 优雅的方法来做到这一点?我在布尔数组上这样做,所以无论填充操作是否涉及跨其他轴求和,或者只是复制给定元素(在本例中为维度 1 的元素 1)的值,我都不介意。

提前感谢任何thoughts/assistance。

一种节省内存的解决方案是使用 np.broadcast_to 来查看输出 -

In [14]: a # input array
Out[14]: 
array([[[False, False, False, False],
        [False,  True, False,  True],
        [False, False, False, False]],

       [[False, False, False, False],
        [False,  True, False,  True],
        [False, False, False, False]]])

In [15]: np.broadcast_to(a.any(1,keepdims=True), a.shape)
Out[15]: 
array([[[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]]])

如果您需要输出有自己的内存 space,请在此处附加 .copy()

或者,我们可以使用 np.repeat -

In [63]: np.repeat(a.any(1,keepdims=True) ,a.shape[1],axis=1)
Out[63]: 
array([[[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]],

       [[False,  True, False,  True],
        [False,  True, False,  True],
        [False,  True, False,  True]]])