[英]Number of values within a specific range in Python
我有一个数组T
。 我试图通过T1
查找指定范围内的值的数量,但出现错误。 我提出了预期的 output。
T=np.array([4.7,5.1,2.9])
T1=np.flatnonzero(2<T<3,3<T<4,4<T<5)
print(T1)
错误是
in <module>
T1=np.flatnonzero(2<T<3,3<T<4,4<T<5)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
预期的 output 是
T1=[1,0,1]
您需要将范围一分为二并对结果sum
。 您也不需要在这里使用np.flatnonzero
,它与您正在做的事情并没有真正的联系
T1 = ((2 < T) & (T < 3)).sum(), ((3 < T) & (T < 4)).sum(), ((4 < T) & (T < 5)).sum()
print(T1) # (1, 0, 1)
你为什么期望它起作用?
2<T<3
中中断。 您不能在numpy
中使用这种语法。 您应该将2<T<3
替换为(2<T) & (T<3)
,这相当于np.logical_and
。 因此,您需要两个 boolean arrays (2<T) AND (T<3) element-wise 的真值,如文档中所述。np.flatnonzero
接受一个参数。 如果要插入多个条件,请使用|
(或np.logical_or
)获取两个 boolean arrays arr1
OR arr2
元素的真值。cond1 = (2<T) & (T<3)
cond2 = (3<T) & (T<4)
cond3 = (4<T) & (T<5)
每个值满足的条件数:
>>> np.sum([cond1, cond2, cond3], axis=0)
array([1, 0, 1])
Arrays 个满足每个条件的值:
>>> T[cond1], T[cond2], T[cond3]
(array([2.9]), array([], dtype=float64), array([4.7]))
Arrays 个满足每个条件的值索引:
>>> np.flatnonzero(cond1), np.flatnonzero(cond2), np.flatnonzero(cond3)
(array([2], dtype=int64), array([], dtype=int64), array([0], dtype=int64))
flatnonzero
与您想要的无关。(2<T) & (T<3)
.T[(2<T) & (T<3)]
将根据条件生成 T 值的数组。因此,如果您需要计算 T 中介于 2 和 3 之间的元素,您可以这样做:
len(T[(2 <T) & (T < 3)])
为了获得你想要的,你可以这样做:
Ranges = [(2,3),(3,4),(4,5)]
T1 = [len(T[(a < T) & (T < b)]) for a,b in Ranges]
print(T1)
# [1, 0, 1]
要打印符合条件的实际值,您可以执行以下操作:
T2 = [list(T[(a < T) & (T < b)]) for a,b in Ranges]
print(T2)
# [[2.9], [], [4.7]]
为了获得相应的索引,我们最终使用了flatnonzero
:
T3 = [list(np.flatnonzero((a < T) & (T < b))) for a,b in Ranges]
print(T3)
# [[2], [], [0]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.