我是python语法的新手。
我想总结5个数组(布尔值,像素值为1或0),并将最终的大值pixel(5) == 1
,其他values == 0
。
resArraySum = np.array(5, (first | second | third | fourth | fifth), 1, 0)
print resArraySum
这不正确。
答案 0 :(得分:1)
如果我理解正确,你想要添加5个数组,然后创建一个像素和5的掩码。我在这里看到一些与python及其语法无关的概念。
首先,python中的布尔值定义为True
和False
,0
和1
只是没有布尔属性的整数(如果你比较它们,则不完全正确) ,但我们暂时不要这样做。)
其次,你正在寻找的只是logical and
运算符,总结了5个0和1的数组,然后找到总和为5的索引有点开销,你可以直接在逻辑上比较它们。 / p>
伪代码看起来像这样:
对于少量面具:
result = bool_mask[0] & bool_mask[1] & bool_mask[2] & bool_mask[3]
对于大量的面具:
# bool_mask = [a, b, c, d, e, f....] number of boolean arrays
result = bool_mask[0] # Equivalent to:
for mask in bool_mask[1:]: # for i in range(1, len(bool_mask)):
result &= mask # result &= bool_mask[i]
使用N
个屏蔽,bool_mask
包含您要比较的boolean arrays
的列表。
所以,你要做的第一件事就是正确创建一个布尔数组。有了numpy,你可以用各种不同的方式做到这一点:
创建它:
>>> A = np.array([1, 0, 1], dtype=np.bool) # will cast 1 to True and 0 to False
>>> A
array([ True, False, True], dtype=bool)
转换它:
>>> A = np.array([1, 0, 1], dtype=int) # An integer array with 0 and 1
>>> A = A.astype(np.bool)
>>> A
array([ True, False, True], dtype=bool)
比较:
>>> A = np.array([1, 0, 1], dtype=int) # Same int array
>>> A = A > 0.5
>>> A
array([ True, False, True], dtype=bool)
将布尔数组设为真正的布尔值之后,上面的任何伪代码(它是实际工作代码)都可以正常工作。
之后,如果您最终得到类型为result
(布尔值)的数组np.bool
,其中True
值与所有掩码相交,其他位置为False
。如果您确实想要返回0
和1
值,则只需将结果转换为:
result = result.astype(int)
True
将1
与False
映射到0
。其他做类似事情的方法是:
result = result * 1
numpy中的任何类型的数值运算都会将一个布尔数组转换为整数。
现在,您会发现(如上所述)虽然1
和0
数组不是布尔数组,但同一个&
运算符将会生成咬合比较最终表现得像布尔数组(只要它们只包含1
和0
值)。因此,
result = a & b & c & d
适用于integer
(仅包含1
和0
)和boolean
数组。但是,我建议尽可能使用布尔数组,因为numpy的许多有趣特性如boolean indexing仅在数组是真正的布尔值时才有效(整数数组0
和1
会表现出来与你期望的完全不同。