如何计算Numpy数组中某个范围内的值?

Str*_*247 39 python arrays numpy

我有一个NumPy值的数组.我想计算这些值中有多少是在x <100和x> 25的特定范围内.我已经读过有关计数器的信息,但它似乎只对特定值有效,而不是值范围.我搜索过,但没有找到任何关于我的具体问题.如果有人能指出我正确的文件,我会很感激.谢谢

我试过这个

   X = array(X)
   for X in range(25, 100):
       print(X)
Run Code Online (Sandbox Code Playgroud)

但它只是给我25到99之间的数字.

编辑 我使用的数据是由另一个程序创建的.然后我使用脚本来读取数据并将其存储为列表.然后我拿起列表并使用array(r)将其转换为数组.

编辑

运行的结果

 >>> a[0:10]
 array(['29.63827346', '40.61488812', '25.48300065', '26.22910525',
   '42.41172923', '20.15013315', '34.95323355', '13.03604098',
   '29.71097606', '9.53222141'], 
  dtype='<U11')
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 71

如果调用a了数组,则满足的元素数量25 < x < 100

((25 < a) & (a < 100)).sum()
Run Code Online (Sandbox Code Playgroud)

该表达式(25 < a) & (a < 100)产生一个布尔数组,其形状aTrue满足条件的所有元素的值相同.求和此布尔阵列对待True值作为1False0.

  • 哦,我知道可能会发生什么.如果dtype是意外的,那么你会得到一个不可解决的类型错误 - 例如2 <numpy.array(range(10),dtype = str)给出了这个消息. (3认同)

sen*_*rle 9

你可以用histogram.这是一个基本的用法示例:

>>> import numpy
>>> a = numpy.random.random(size=100) * 100 
>>> numpy.histogram(a, bins=(0.0, 7.3, 22.4, 55.5, 77, 79, 98, 100))
(array([ 8, 14, 34, 31,  0, 12,  1]), 
 array([   0. ,    7.3,   22.4,   55.5,   77. ,   79. ,   98. ,  100. ]))
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,它看起来像这样:

>>> numpy.histogram(a, bins=(25, 100))
(array([73]), array([ 25, 100]))
Run Code Online (Sandbox Code Playgroud)

此外,当您有一个字符串列表时,您必须显式指定类型,以便numpy知道生成一个浮点数组而不是字符串列表.

>>> strings = [str(i) for i in range(10)]
>>> numpy.array(strings)
array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 
      dtype='|S1')
>>> numpy.array(strings, dtype=float)
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])
Run Code Online (Sandbox Code Playgroud)


Eri*_*got 8

基于Sven的良好方法,您也可以做得更直接:

numpy.count_nonzero((25 < a) & (a < 100))
Run Code Online (Sandbox Code Playgroud)

这首先创建一个布尔数组,其中一个布尔值用于数组中的每个输入数字a,然后计算非假(即True)值的数量(它给出匹配数字的数量).

但请注意,这种方法的速度是Sven方法的两倍.sum(),在100k数字的数组(NumPy 1.6.1,Python 2.7.3)上 - 大约300μs而不是150μs.


ber*_*nie 6

如果您不想进一步处理匹配值,Sven 的答案就是这样做的方法。
以下两个示例返回仅包含匹配值的副本:

np.compress((25 < a) & (a < 100), a).size
Run Code Online (Sandbox Code Playgroud)

或者:

a[(25 < a) & (a < 100)].size
Run Code Online (Sandbox Code Playgroud)

示例解释器会话:

>>> import numpy as np
>>> a = np.random.randint(200,size=100)
>>> a
array([194, 131,  10, 100, 199, 123,  36,  14,  52, 195, 114, 181, 138,
       144,  70, 185, 127,  52,  41, 126, 159,  39,  68, 118, 124, 119,
        45, 161,  66,  29, 179, 194, 145, 163, 190, 150, 186,  25,  61,
       187,   0,  69,  87,  20, 192,  18, 147,  53,  40, 113, 193, 178,
       104, 170, 133,  69,  61,  48,  84, 121,  13,  49,  11,  29, 136,
       141,  64,  22, 111, 162, 107,  33, 130,  11,  22, 167, 157,  99,
        59,  12,  70, 154,  44,  45, 110, 180, 116,  56, 136,  54, 139,
        26,  77, 128,  55, 143, 133, 137,   3,  83])
>>> np.compress((25 < a) & (a < 100),a).size
34
>>> a[(25 < a) & (a < 100)].size
34
Run Code Online (Sandbox Code Playgroud)

上面的示例使用“按位和”(&) 沿着您为比较目的创建的两个布尔数组进行元素计算。
例如,另一种写出 Sven 出色答案的方法是:

np.bitwise_and(25 < a, a < 100).sum() 
Run Code Online (Sandbox Code Playgroud)

布尔数组包含True条件匹配和False不匹配时的值。
布尔值的一个额外方面True是相当于 1 和False0。