【问题标题】:How to check efficiently numpy array contains item within given range?如何有效地检查numpy数组是否包含给定范围内的项目?
【发布时间】:2017-11-01 02:14:05
【问题描述】:

我有一个名为 a 的 numpy 数组,我想检查它是否包含由两个值指定的范围内的项目。

import numpy as np
a = np.arange(100)

mintrshold=33
maxtreshold=66

我的解决方案:

goodItems = np.zeros_like(a)
goodItems[(a<maxtreshold) & (a>mintrshold)] = 1

if goodItems.any(): 
   print (there s an item within range)

你能建议我一个更有效的pythonic方法吗?

【问题讨论】:

  • 我不知道 numpy 本身,但是对于普通的 python 列表,我会这样写;如果有(mintrshold

标签: python arrays numpy


【解决方案1】:

除了纯 Numpy 答案,我们还可以使用 itertools

import itertools

bool(list(itertools.ifilter(lambda x: 33 <= x <= 66, a)))

对于较小的数组,这就足够了:

bool(filter(lambda x: 33 <= x <= 66, a))

【讨论】:

  • 我试过你的第二行,但它不起作用,总是以 True 结束
  • 我认为这是所需的输出,如果数组中的数字确实符合条件,则返回 True。如果您需要返回的布尔值列表/数组,请告诉我,我可以为此进行修改。
  • 你很好地解释了我的问题,但是如果 a=np.arange(100,120),你的第二行仍然返回 True
  • 它为我返回False,我想您可能正在复制或输入错误的内容。鉴于a=np.arange(100,120),我的两个单行线都返回False
  • 我用 pyton 3.6 尝试了你的第二个 oneliner,它返回 True,在 python 2.5 中它返回 False (a=np.arange(100,120)):D。我昨天才用 3.6 检查过。
【解决方案2】:

Numpy 数组不适用于 pythonic a &lt; x &lt; b。但是有这个功能:

np.logical_and(a > mintrshold, a < maxtreshold)

np.logical_and(a > mintrshold, a < maxtreshold).any()

在您的特定情况下。基本上,您应该结合两个元素操作。寻找logic funcs了解更多详情

【讨论】:

  • 谢谢,它比我幼稚的解决方案更优雅,速度快 2.5 倍。
猜你喜欢
  • 1970-01-01
  • 2023-02-01
  • 2016-11-07
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2021-03-15
相关资源
最近更新 更多