为了说明我的观点,让我们用这个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]])