【问题标题】:Python filter numpy array based on mask arrayPython基于掩码数组过滤numpy数组
【发布时间】:2021-06-24 11:05:10
【问题描述】:

假设我有一个长度为 N 的数据 numpy 数组和一个长度为 N 的位掩码数组。

data = [1,2,3,4,5,6,7,8,9,0]
mask = [0,1,0,1,0,1,0,1,0,1]

是否有一种无循环的 numpy 方法来创建基于数据的新数组,这样当且仅当 mask[i] != 0 时它才会获取所有数据条目?像这样:

func(data, mask) = [2,4,6,8,0]

或者等效地用循环表示法:

ans = []
for idx in range(mask):
    if mask[idx]:
        ans.append(data[idx])
ans = numpy.array(ans)

谢谢!

【问题讨论】:

  • 您的问题比链接的副本更简单,因为您只在一个维度上工作。所需的代码是……等待它……data[mask != 0]。是的,这种简化是 Numpy 的核心卖点之一。当然,您确实需要从 Numpy 数组开始,而不是简单的 Python 列表。
  • 您应该检查:numpy doc with solution。在您的情况下,只需执行以下操作:np.ma.array(data, mask=mask).data(之前将列表更改为数组)。
  • @Memristor 当我尝试np.ma.array(data, mask=mask).data 时,我只得到了原始数组。目前还不清楚您发布的链接如何用于获得 OP 想要的结果。
  • 是的,.data 似乎为您提供了原始数组。 .tolist() 为您提供屏蔽列表,但不删除屏蔽值。它们总是充满fill_valueNone 或自定义值)。
  • @MarkM 对不起,你必须得到x = np.ma.array(...)x[~x.mask].data 的结果,它会删除掩码为0 的元素;另一种方法是使用 where: np.where([1, 0, 1, 0, 1], [1, 2, 3, 4, 5], 0) 不会删除它们,而是用 0 代替。

标签: python arrays numpy


【解决方案1】:

您可以使用布尔值数组过滤 numpy 数组。你从一个整数数组开始,你不能直接使用它,但你当然可以将一和零解释为布尔值,然后直接将它用作掩码:

import numpy as np

data = np.array([1,2,3,4,5,6,7,8,9,0])
mask = np.array([0,1,0,1,0,1,0,1,0,1])

data[mask.astype(bool)]
# array([2, 4, 6, 8, 0])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多