没有“制表符分隔数组”之类的东西。 r 的显示与 numpy array 一致(错误消息也是如此)。它可能是从制表符分隔的 CSV 加载的。无论如何,count 是一种列表方法,而不是数组方法。要么将其转换为列表,要么使用其中一种迭代解决方案。
有一个数组bincount。由于您的数组似乎是合理范围内的整数,例如0-1000),这里可能适用。
制作一个样本数组:
In [147]: r=np.random.randint(0,1000,2000)
In [148]: r
Out[148]: array([170, 754, 151, ..., 115, 299, 879])
它的str 显示是:
In [166]: print(r)
[170 754 151 ..., 115 299 879]
这可能会让不了解numpy 的 Python 程序员感到困惑。
bincount 查找范围内所有值的计数:
In [152]: np.bincount(r)
Out[152]:
array([4, 1, 2, 1, 1, 5, 4, 3, 2, 1, 1, 1, 3, 3, 2, 4, 3, 2, 1, 1, 0, 1, 4,
...
1, 3, 0, 2, 1, 2, 3, 1, 2, 3, 3])
我可能应该使用np.bincount(r,minlength=1000)。
该计数列表中的第 7 个值是 4,所以让我们选择它:
In [176]: np.bincount(r,minlength=1000)[6]
Out[176]: 4
如果我先将r 转换为列表,我可以使用count:
In [177]: r.tolist().count(6)
Out[177]: 4
迭代解决方案也有效,但速度较慢:
def foo(a,v):
my_count=0
for i in r:
if (i==v):
my_count+=1
return my_count
In [178]: foo(r,6)
Out[178]: 4
时间测试:
In [180]: timeit foo(r,6)
1000 loops, best of 3: 983 us per loop
In [181]: timeit len([i for i in r if i==6])
1000 loops, best of 3: 985 us per loop
In [182]: timeit r.tolist().count(6)
10000 loops, best of 3: 125 us per loop
In [183]: timeit np.bincount(r)[6]
100000 loops, best of 3: 8.2 us per loop
另一个好的数组版本在一个编译表达式中测试value。
In [189]: timeit (r==6).sum()
10000 loops, best of 3: 29.5 us per loop
要同时测试多个值,请使用如下表达式:
In [194]: (r==np.array([6,42,242])[:,None]).sum(axis=1)
Out[194]: array([4, 5, 1])