繁体   English   中英

Python 中特定范围内的值个数

[英]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)

你为什么期望它起作用?

  1. 它在2<T<3中中断。 您不能在numpy中使用这种语法。 您应该将2<T<3替换为(2<T) & (T<3) ,这相当于np.logical_and 因此,您需要两个 boolean arrays (2<T) AND (T<3) element-wise 的真值,如文档中所述。
  2. 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<3:您需要将其分成 2 个条件: (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM