给定一系列未排序的点我需要替换给定间隔中的点。我想到的最简单的方法是
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
但使用inf
和sup
值的相同设置,即
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
建议?
答案 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])
在给定的示例中,在另一个答案中使用&
同样有效,如果不是更好,但这可能更普遍适用,例如检查每个值的某些功能。