我使用以下代码计算两个值(1,-1)的出现次数:
import numpy as np
a = np.empty(0, dtype=np.int)
tmp = [-1,1,1,1,1,1,-1, 1, -1]
a = np.append(a, tmp)
unique, counts = np.unique(a, return_counts=True)
r = dict(zip(unique, counts))
print r
if r.values()[0] > r.values()[1]:
print r.keys()[0]
else:
print r.keys()[1]
问题是tmp
有时可能都是1或-1,导致打印失败。我能想到的可能的解决方案是添加零值的类似null的键。例如,当tmp=[1,1,1,1]
时,r
应为{1: 4, -1: 0}
,反之亦然。如何修改此代码?
谢谢
答案 0 :(得分:1)
给出输入列表/数组仅包含-1
和1
的一个技巧是使用偏移数组(偏移1,使-1为0,1为2)进行分箱计数np.bincount
,然后使用2
的步长进行切片,以考虑计算-1
和1
-
dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
样品运行 -
In [954]: a = np.array([-1,1,1,1,1,1,-1,1,-1])
In [955]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[955]: {-1: 3, 1: 6}
In [956]: a = np.array([-1,-1,-1,-1])
In [957]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[957]: {-1: 4, 1: 0}
In [958]: a = np.array([1,1,1,1])
In [959]: dict(zip([-1,1],np.bincount(a+1,minlength=3)[::2]))
Out[959]: {-1: 0, 1: 4}
如果您只需要-1
或1
中的哪一个具有更大的数量,只需执行 -
np.bincount(a+1,minlength=3).argmax()-1
答案 1 :(得分:0)
只是免费,说你有
>>> uvalues = [-1,1]
代表要计算的值列表。
做{uvalue:r.get(uvalue,0) for uvalue in uvalues}
<小时/> 用例
>>> a = np.array([-1,-1, -1, -1])
>>> unique, counts = np.unique(a, return_counts=True)
>>> r = dict(zip(unique, counts))
>>> r
{-1: 4}
>>> {uvalue:r.get(uvalue,0) for uvalue in uvalues}
{1: 0, -1: 4}
答案 2 :(得分:0)
使用collections.Counter的其他自然(快速)解决方案:
from collections import Counter
tmp = [1,1,1,1,1,1]
c=Counter({1:0,-1:0}) # init
c.update(tmp)
#Counter({-1: 0, 1: 6})