首页 > 解决方案 > 填充numpy数组的指定维度

问题描述

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

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

有没有人有更整洁/更优雅的方式来做到这一点?我在布尔数组上执行此操作,因此填充操作是否涉及在其他轴上求和,或者只是从给定元素(在本例中为维度 1 的元素 1)复制值,我不介意。

提前感谢您的任何想法/帮助。

标签: pythonnumpynumpy-ndarray

解决方案


一种节省内存的解决方案是用于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]]])

如果您需要输出有自己的内存空间,请在.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]]])

推荐阅读