要对数组求和并获得像素== 1的最终大值,其他值== 0

时间:2016-03-29 04:01:45

标签: python numpy

我是python语法的新手。

我想总结5个数组(布尔值,像素值为1或0),并将最终的大值pixel(5) == 1,其他values == 0

resArraySum = np.array(5, (first | second | third | fourth | fifth), 1, 0)
print resArraySum

这不正确。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要添加5个数组,然后创建一个像素和5的掩码。我在这里看到一些与python及其语法无关的概念。

首先,python中的布尔值定义为TrueFalse01只是没有布尔属性的整数(如果你比较它们,则不完全正确) ,但我们暂时不要这样做。)

其次,你正在寻找的只是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。如果您确实想要返回01值,则只需将结果转换为:

result = result.astype(int)

True1False映射到0。其他做类似事情的方法是:

result = result * 1

numpy中的任何类型的数值运算都会将一个布尔数组转换为整数。

现在,您会发现(如上所述)虽然10数组不是布尔数组,但同一个&运算符将会生成咬合比较最终表现得像布尔数组(只要它们只包含10值)。因此,

result = a & b & c & d

适用于integer(仅包含10)和boolean数组。但是,我建议尽可能使用布尔数组,因为numpy的许多有趣特性如boolean indexing仅在数组是真正的布尔值时才有效(整数数组01会表现出来与你期望的完全不同。