numpy array.all()多维数组的解决方案,其中array.all(axis=1).all(axis=1)给出所需的结果

5hcedyr0  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个多维的NumPy类数组,(我使用Dask,但这适用于NumPy,因为Dask模仿了API),它来自1592个图像的数组:
a

array([[[ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        ...,
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True]],

       ...,

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

我想保留蒙版包含False条目的图像,并删除 * all * True的图像。我可以用array.all()这样做:

mask = a.all(axis=1).all(axis=1)
retain = np.where(mask==False,filenames,None)
#write `retain` to a file to be read by another script

其中filenames是我的文件路径列表。
但是,我不觉得a.all(axis=1).all(axis=1)非常令人满意。在我看来,这就像我在数组上运行了两次,而一次就足够了。但我有吗
注:a.all(axis=1)给出:

array([[ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True,  True,  True,  True,  True,  True,  True,  True,
         True,  True],

       ...,

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

并且a.all(axis=1).all(axis=1)给出:

array([ True, False, False, False,  True,  True, False, False, False,

        ...,

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

在这个例子中,我是否可以更有效地从三维数据转换到一维数据?

nnt7mjpx

nnt7mjpx1#

是吗

mask = a.all(axis=(1,2))

这比你现在做的要快。请注意,当您对数组进行两次检查时,第二次会更短。你实际上是在

b = a.all(axis=1)
mask = b.all(axis=1)

所以第二次你会看到一个更短的数组。
PS:你可以简化你的代码如下。

mask = a.all(axis=(1,2))
retain = filenames[~mask]

相关问题