numpy 通过移位值创建数组

7rfyedvj  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(219)

我有一个整数d和布尔数组

M = array([[ True, False, False,  True],
           [False,  True, False, False],
           [False, False, False, False],
           [False, False, False,  True]])

现在我想用以下规则从M创建一个新数组:True保持不变,True左边的下一个d位置也变为True。我想到了这个

newarray = np.full_like(M,False)
  for r,row in enumerate(M[1:],1):
    for i,boo in enumerate(row):
      if boo:
        newarray[max(0,r-d):r,i] = True

我觉得有一种更有效的方法可以使用numpy命令来实现这一点;可能使用np. where。
编辑:例如d = 1,结果应为

M = array([[ True, False,  True,  True],
           [ True,  True, False, False],
           [False, False, False, False],
           [False, False,  True,  True]])

对于d = 2,结果应为

M = array([[ True,  True,  True,  True],
           [ True,  True, False, False],
           [False, False, False, False],
           [False,  True,  True,  True]])
lnxxn5zx

lnxxn5zx1#

您可以使用scipy.signal.convolve2d的2D卷积:

from scipy.signal import convolve2d

d = 2

kernel = np.repeat([1, 1, 0], [d, 1, d])[None]
# array([[1, 1, 1, 0, 0]])

out = convolve2d(M, kernel, mode='same') > 0

d = 1的输出:

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

d = 2的输出:

array([[ True,  True,  True,  True],
       [ True,  True, False, False],
       [False, False, False, False],
       [False,  True,  True,  True]])
x7rlezfr

x7rlezfr2#

类似于@mozway,但使用numpy的sliding_window_viewpad

import numpy as np
from numpy.lib.stride_tricks import sliding_window_view as swv

M = array([[ True, False, False,  True],
           [False,  True, False, False],
           [False, False, False, False],
           [False, False, False,  True]])

d = 2

out = swv(np.pad(M, ((0, 0), (0, d))), d + 1, axis=1).any(axis=2)

输出:

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

相关问题