在数组中查找元素,使得inf<元素<在Python中的sup

时间:2018-06-01 13:32:50

标签: python arrays numpy

给定一系列未排序的点我需要替换给定间隔中的点。我想到的最简单的方法是

import numpy as np

def v1(array,inf,sup):
    for i in range(len(array)):
        if inf<array[i]<sup:
            array[i]-=10
    return array

我被建议使用np.where。如果只有一个布尔条件,它可以顺利运行:

def v2(array,sup):
    array[np.where(array < sup)[0]]-=10
    return array

但使用infsup值的相同设置,即

array[np.where(inf < array < sup)[0]]-=10

会引发错误

ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all().

我必须做一些笨拙的事情,例如在两个条件下使用np.where两次并将两个结果索引数组相交...

def v2(array,inf,sup):
    i=list(set.intersection(set(np.where(array>inf)[0]),set(np.where(array<sup)[0])))
    array[i]-=10
    return array

建议?

2 个答案:

答案 0 :(得分:3)

使用&np.where具有多个条件:

array[np.where((inf < array) & (array < sup))[0]] -= 10

或没有np.where

array[(inf < array) & (array < sup)] -= 10

答案 1 :(得分:0)

或者,您也可以使用列表推导作为索引,并对理解中的每个元素使用比较链。

>>> A = np.array([i*10 for i in range(10)])
>>> inf, sup = 30, 70
>>> A[[inf < x < sup for x in A]] *= 10
>>> A
array([  0,  10,  20,  30, 400, 500, 600,  70,  80,  90])

在给定的示例中,在另一个答案中使用&同样有效,如果不是更好,但这可能更普遍适用,例如检查每个值的某些功能。