我在这个问题上花了太长时间,我认为应该只花几分钟时间来弄清楚。我有一个名为 i 的数组,其中包含 1-21 之间的约 400 个数字。我想计算数据中每个数字 1-21 的频率。我还想将此范围限制在 1-16 之间,并排除 16 以上的数字。
这就是我要做的工作,但它非常笨重且效率低下。我觉得必须有一种方法可以大大缩短它。我需要能够获取频率输出并将它们放在一个名为 nvals 的排序数组中,我可以将其用于后续计算。
i=bin_numDM+(bin_numF-1)*fbins
ones= 0
twos=0
threes=0
fours=0
fives=0
sixes=0
sevens=0
eights=0
nines=0
tens=0
elevens=0
twelves=0
thirteens=0
fourteens=0
fifteens=0
sixteens=0
for item in i:
if item ==1:
ones = ones + 1
if item==2:
twos=twos+1
if item==3:
threes=threes+1
if item==4:
fours=fours+1
if item==5:
fives=fives+1
if item==6:
sixes=sixes+1
if item==7:
sevens=sevens+1
if item==8:
eights=eights+1
if item==9:
nines=nines+1
if item==10:
tens=tens+1
if item==11:
elevens=elevens+1
if item==12:
twelves=twelves+1
if item==13:
thirteens=thirteens+1
if item==14:
fourteens=fourteens+1
if item==15:
fifteens=fifteens+1
if item==16:
sixteens=sixteens+1
nvals=[ones,twos,threes,fours,fives,sixes,sevens,eights,nines,tens,elevens,twelves,thirteens,fourteens,fifteens,sixteens]
我也试过:
unique, frequency=np.unique(i,return_counts=True)
count=np.asarray((unique,frequency))
这行得通,但我终生无法弄清楚如何将其限制在 1-16 之间的 i 值范围内。
有什么建议吗? :)
您要寻找的答案取决于您是否要使用库。如果您使用的是 numpy 数组,那么
val, count = np.unique(arr, return_counts=True)
是要走的路。否则,你应该避免为每一个可能的结果调用
if
。相反,您可以使用字典来存储您的项目实例:
l = [1,2,2,3,5]
solution = {i:0 for i in range(16)}
for item in l:
if item in solution:
solution[item] += 1
您可以先删除要排除的元素,然后再进行计数。
import numpy as np
i = np.arange(1, 22)
filtered_i = np.delete(i, np.where(i > 16))
unique, frequency=np.unique(filtered_i, return_counts=True)
count=np.asarray((unique, frequency))
使用numpy.unique:
import numpy as np
i = np.random.randint(1,22,400)
unique, counts = np.unique(i, return_counts=True)
ocurrences = dict(zip(unique[:16], counts[:16]))