首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用np.isclose()比较np.array()

使用np.isclose()比较np.array()
EN

Stack Overflow用户
提问于 2021-08-23 16:05:45
回答 3查看 103关注 0票数 1

我想使用np.isclose()来比较图像的像素数组。下面是我想做的事:

代码语言:javascript
复制
print(image_array.shape) # (320, 240, 4)

for i in range(0, len(image_array)):
    for j in range(0, len(image_array[i])):
        if np.isclose(image_array[i][j], [1, 0, 0, 1]):
            image_array[i][j] = [0, 1, 0, 1]

但是我得到了下面的错误ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我不能使用np.all(),因为我想替换所有甚至足够接近的像素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-23 16:11:03

与其使用np.isclose,不如使用np.allclose。这将为该比较返回一个布尔值。

票数 2
EN

Stack Overflow用户

发布于 2021-08-23 16:10:01

在文档中- isclose“返回一个布尔数组,其中两个数组在公差范围内元素上是相等的。

因此,返回的布尔值数组表示4元素数组的每个值的近似值。这取决于您如何将该数组转换为单个布尔值。

例如,您可能只关心这4种匹配中的任何一种,在这种情况下,您可以使用any();或者,如果您关心是否所有匹配,则可以使用all()

票数 0
EN

Stack Overflow用户

发布于 2021-08-23 17:31:47

image_array[i,j]是一个形状(4,)数组(您可以检查它)。isclose[1,0,0,1]是一个相同大小的布尔数组。它不能在if中使用。但是您可以将all应用于此,也可以使用allclose来测试“像素”是否匹配。

但是,如果没有双循环,您可以进行如下测试:

代码语言:javascript
复制
In [381]: arr = np.random.randint(0,2,(3,6,4))
In [382]: arr.shape
Out[382]: (3, 6, 4)
In [383]: np.isclose(arr,np.array([1,0,0,1]))
Out[383]: 
array([[[ True,  True, False, False],
        [False, False,  True,  True],
        [ True,  True,  True, False],
        [False, False,  True, False],
        [ True, False, False,  True],
        [ True, False, False, False]],

       [[False,  True, False, False],
        [ True,  True,  True, False],
        [ True, False, False,  True],
        [False, False,  True,  True],
        [False,  True,  True, False],
        [False, False,  True,  True]],

       [[False, False, False,  True],
        [ True,  True,  True,  True],
        [ True,  True, False, False],
        [ True, False,  True,  True],
        [False, False, False, False],
        [False, False, False,  True]]])

(由于我使用的是randint arr,所以是int dtype,而==应该和isclose一样好。但下面的情况是一样的。

在最后一个维度上应用all

代码语言:javascript
复制
In [384]: np.isclose(arr,np.array([1,0,0,1])).all(axis=-1)
Out[384]: 
array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False,  True, False, False, False, False]])

这里有一个“像素”匹配,我们可以识别:

代码语言:javascript
复制
In [385]: I,J = np.nonzero(_)
In [386]: I,J
Out[386]: (array([2]), array([1]))
In [387]: arr[2,1]
Out[387]: array([1, 0, 0, 1])

或者为这两个数组建立索引:

代码语言:javascript
复制
In [389]: arr[I,J]
Out[389]: array([[1, 0, 0, 1]])

这是一个(n,4)数组,其中n是匹配的数目(可能是0)。我们可以用它来修改arr

代码语言:javascript
复制
In [390]: arr[I,J]=[1,0,1,0]

现在没有匹配了:

代码语言:javascript
复制
In [391]: np.isclose(arr,np.array([1,0,0,1])).all(axis=-1)
Out[391]: 
array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False, False, False]])

但是,现在有3个匹配的新值:

代码语言:javascript
复制
In [392]: np.isclose(arr,np.array([1,0,1,0])).all(axis=-1)
Out[392]: 
array([[ True, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False,  True,  True, False, False, False]])
In [393]: arr[_]          # index with the boolean mask
Out[393]: 
array([[1, 0, 1, 0],
       [1, 0, 1, 0],
       [1, 0, 1, 0]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68895789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档