【问题标题】:How to efficiently filter two-dimensional np array by values given in a list (by many values)如何通过列表中给出的值(通过许多值)有效地过滤二维 np 数组
【发布时间】:2021-10-11 08:37:48
【问题描述】:

我有一个二维 np 数组,我需要通过列表中给出的值有效地过滤它。

b = np.array([['a', 'b', 'c', 'd'], ['b', 'a', 'c', 'd'], ['c', 'b', 'a', 'd'], ['a', 'd', 'c', 'b']])
values_to_stay_in_b = ['a', 'b']

我找到了使用设置差异的解决方案,但是数组 b 中的位置很重要。

有比以下简单列表推导更好的解决方案吗:

output = []
for l in b:
    output.append([a for a in l if a in values_to_stay_in_b ])
np.array(output)

结果:

array([['a', 'b'],
       ['b', 'a'],
       ['b', 'a'],
       ['a', 'b']], dtype='<U1')

【问题讨论】:

  • 输出中每行的列数总是相同吗?
  • 无论如何,您都必须遍历所有值。所以就效率而言,我认为没有什么可做的。您可以将 values_to_stay_in_b 存储在字典中以缩短查找时间。如果您正在寻找编写更 Pythonic 的方法,也许您可​​以使用像 b[b=='a'] 这样的调用。
  • @DaniMesejo 是的

标签: python arrays numpy


【解决方案1】:

使用纯 numpy,因此至少删除 for 循环。

对于b中的每个条目,将其与values_to_stay_in_b中的每个条目进行比较,得到一个掩码列表。这是通过添加额外的轴和使用广播来完成的。

其中任何一个都必须是真实的。

由于您澄清过滤后每一行都有相同的列,所以我根据行数对其进行整形

b[(b[..., None] == values_to_stay_in_b).any(axis=2)].reshape(b.shape[0], -1)

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 2018-12-28
    • 2021-03-05
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多