无法从多个NumPy数组中检索所需的索引

3
我有4个形状相同的numpy数组(即2d)。我需要知道最后一个数组(d)中小于20的元素的索引,但这些d的索引应位于数组(a)元素为1的区域内;同时数组(b)和(c)的元素不为1。
我的尝试如下:
mask = (a == 1)|(b != 1)|(c != 1)

answer = d[mask | d < 20]

现在,我需要将d的这些区域设置为1;并将d的所有其他区域设置为0。
d[answer] = 1
d[d!=1] = 0
print d

我无法解决这个问题。你怎么解决的?
import numpy as np

a = np.array([[0,0,0,1,1,1,1,1,0,0,0],
                 [0,0,0,1,1,1,1,1,0,0,0],
                 [0,0,0,1,1,1,1,1,0,0,0],
                 [0,0,0,1,1,1,1,1,0,0,0],
                 [0,0,0,1,1,1,1,1,0,0,0],
                 [0,0,0,1,1,1,1,1,0,0,0]])

b = np.array([[0,0,0,1,1,0,0,0,0,0,0],
                 [0,0,0,0,0,0,1,1,0,0,0],
                 [0,0,0,1,0,1,0,0,0,0,0],
                 [0,0,0,1,1,1,0,1,0,0,0],
                 [0,0,0,0,0,0,1,0,0,0,0],
                 [0,0,0,0,1,0,1,0,0,0,0]])

c = np.array([[0,0,0,0,0,0,1,0,0,0,0],
                 [0,0,0,0,0,0,0,0,0,0,0],
                 [0,0,0,0,0,0,1,1,0,0,0],
                 [0,0,0,0,0,0,1,0,0,0,0],
                 [0,0,0,0,1,0,0,0,0,0,0],
                 [0,0,0,0,0,1,0,0,0,0,0]])


d = np.array([[0,56,89,67,12,28,11,12,14,8,240],
                 [1,57,89,67,18,25,11,12,14,9,230],
                 [4,51,89,87,19,20,51,92,54,7,210],
                 [6,46,89,67,51,35,11,12,14,6,200],
                 [8,36,89,97,43,67,81,42,14,1,220],
                 [9,16,89,67,49,97,11,12,14,2,255]])
1个回答

2

应该将条件 AND 起来,而不是 OR。您可以先获取表示所需区域的布尔数组/掩码,然后基于它修改 d:

mask = (a == 1) & (b != 1) & (c != 1) & (d < 20)
d[mask] = 1
d[~mask] = 0
print d

输出:

[[0 0 0 0 0 0 0 1 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 1 0 0 0]]

1
谢谢,已赞!你能解释一下为什么要用“AND”操作符连接在一起吗?是因为条件存储在不同的数组中吗? - Borys
2
由于所有条件必须同时满足,因此需要使用AND操作。无论它们是否在不同的数组中(将其更改为|不会导致语法错误,但会导致逻辑错误)。 - YS-L
2
@simen,直觉告诉你,在问题规格的文本描述中,你使用了and来表示每个条件。将问题规格写成文本形式始终是编写解决方案的好开始(如果你注意到了它)。 - wwii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接