替换2d numpy数组的特定值,但仅限于边缘



为了说明我的观点,让我们用这个2d numpy数组:

array([[1, 1, 5, 1, 1, 5, 4, 1],
[1, 5, 6, 1, 5, 4, 1, 1],
[5, 1, 5, 6, 1, 1, 1, 1]])

我想用其他值替换值1,比如0,但只在边缘。这是想要的结果:

array([[0, 0, 5, 1, 1, 5, 4, 0],
[0, 5, 6, 1, 5, 4, 0, 0],
[5, 1, 5, 6, 0, 0, 0, 0]])

请注意,被其他值包围的1不会更改。

我可以通过对每一行和元素进行迭代来实现这一点,但我觉得这会非常低效。通常我会使用np.where函数来替换特定的值,但我认为你不能添加位置条件?

m = row!=1   
w1 = m.argmax()-1
w2 = m.size - m[::-1].argmax()

这三行将为您提供开拓性的索引。这个想法是从后面的零开始的。

尝试:

arr = np.array([[1, 1, 5, 1, 1, 5, 4, 1],
[1, 5, 6, 1, 5, 4, 1, 1],
[5, 1, 5, 6, 1, 1, 1, 1]])

for row in arr:
m = row!=1
w1 = m.argmax()-1
w2 = m.size - m[::-1].argmax()
#     print(w1, w2)
row[0:w1+1] = 0
row[w2:] = 0
#     print(row)

arr:

array([[0, 0, 5, 1, 1, 5, 4, 0],
[0, 5, 6, 1, 5, 4, 0, 0],
[5, 1, 5, 6, 0, 0, 0, 0]])

最新更新