我有一个NumPy值数组。我想计算这些值中有多少在特定范围内,例如x <100和x> 25。我已经读过有关计数器的信息,但它似乎只对特定值有效,而不是值范围。我搜索过,但没有找到任何关于我的具体问题。如果有人能指出我正确的文件,我会很感激。谢谢
我试过这个
X = array(X)
for X in range(25, 100):
print(X)
但它只给我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')
答案 0 :(得分:70)
如果您的数组被称为a
,则符合25 < x < 100
的元素数量为
((25 < a) & (a < 100)).sum()
表达式(25 < a) & (a < 100)
生成一个布尔数组,其形状与a
相同,值True
表示满足条件的所有元素。对此布尔数组求和将True
值视为1
,将False
值视为0
。
答案 1 :(得分: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. ]))
在您的特定情况下,它看起来像这样:
>>> numpy.histogram(a, bins=(25, 100))
(array([73]), array([ 25, 100]))
此外,当你有一个字符串列表时,你必须明确指定类型,以便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.])
答案 2 :(得分:8)
基于Sven的好方法,你也可以做得更直接:
numpy.count_nonzero((25 < a) & (a < 100))
这首先为数组a
中的每个输入数创建一个布尔数组,其中一个布尔值,然后计算非假(即True)值的数量(给出匹配数字的数量)。 / p>
但请注意,这种方法的速度是Sven的.sum()
方法的两倍,在100k数字的数组(NumPy 1.6.1,Python 2.7.3)上 - 大约300μs而不是150μs。
答案 3 :(得分:4)
如果您不希望进一步处理匹配值,Sven的答案就是这样做的方法 以下两个示例仅返回仅包含匹配值的副本:
np.compress((25 < a) & (a < 100), a).size
或者:
a[(25 < a) & (a < 100)].size
解释器会话示例:
>>> 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
以上示例使用“按位和”(&amp;)沿着您创建的两个布尔数组进行元素计算,以进行比较。
例如,编写Sven优秀答案的另一种方法是:
np.bitwise_and(25 < a, a < 100).sum()
当条件匹配时,布尔数组包含True
值,而当条件匹配时,则为False
。
布尔值的一个额外方面是True
相当于1而False
相当于0.
答案 4 :(得分:2)
我认为@Sven Marnach的回答非常好,因为它在numpy数组本身运行,这将是快速和有效的(C实现)。
我喜欢把测试放到像25 < x < 100
这样的条件中,所以我可能会这样做:
len([x for x in a.ravel() if 25 < x < 100])