numpy Python中特定范围内的值的数量

6uxekuva  于 2022-12-13  发布在  Python
关注(0)|答案(3)|浏览(125)

我有一个数组T。我试图通过T1查找指定范围内的值的个数,但是我得到了一个错误。我给出了预期的输出。

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()

预期输出为

T1=[1,0,1]
zf9nrax1

zf9nrax11#

你需要把范围分成两部分,结果是sum。你也不需要在这里使用np.flatnonzero,它与你正在做的事情没有真正的联系

T1 = ((2 < T) & (T < 3)).sum(), ((3 < T) & (T < 4)).sum(), ((4 < T) & (T < 5)).sum()
print(T1) # (1, 0, 1)
6psbrbz9

6psbrbz92#

为什么你认为这会奏效?
1.它在2<T<3中中断。你不能在numpy中使用这种语法。你应该用(2<T) & (T<3)替换2<T<3,它等价于np.logical_and。所以你需要两个布尔数组(2〈T)AND(T〈3)元素的真值,就像文档中说的那样。

  1. np.flatnonzero只接受一个参数。如果要插入多个条件,请使用|(或np.logical_or)获取两个布尔数组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])

满足每个条件的值数组:

>>> T[cond1], T[cond2], T[cond3]
(array([2.9]), array([], dtype=float64), array([4.7]))

满足每个条件的值的索引数组:

>>> np.flatnonzero(cond1), np.flatnonzero(cond2), np.flatnonzero(cond3)
(array([2], dtype=int64), array([], dtype=int64), array([0], dtype=int64))
c90pui9n

c90pui9n3#

  • flatnonzero与你想要什么无关。
  • 此外,错误“数组中有多个元素的真值不明确”来自双精度条件2〈T〈3:你需要把它分成两种情况:(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]]

相关问题