2014-02-19 2 views
4

У меня есть два вектора того же размера, один для высоты волны, и один для периода, соответствующего одному в тот же момент времени, в который было произведено измерение. Я хочу знать, сколько раз повторяются два конкретных данных, например:Как подсчитать, сколько раз повторяется пара конкретных значений в массиве?

Hs = [0,5 1,0 2,3 0,5 0,5]

Tm = [2,0 2,5 2,0 2,0 3,0]

Таким образом, вы можете см:

Hs Тт графа

0,5 2,0 2

0,5 2,5 0

0,5 3,0 1

1,0 2,0 0

1,0 2,5 1 ...

Я попытался, но возникают следующие ошибки, потому что появляются целые строки и столбцы без данных, и когда я вижу свою информацию ценности.

from numpy import * 
from matplotlib.pyplot import * 
import matplotlib.pyplot as plt 
from time import * 

clf; cla; close 
dat = loadtxt("ecmwf.dat", unpack=True) 
HSf = dat[0,:] 
HSf = around(HSf,decimals=1) 
TMf = dat[1,:] 
TMf = around(TMf,decimals=1) 
mmat = zeros((31,141)) 

vhs = linspace(0.0,3.0,31) 
vtm = linspace(0.0,14.0,141) 

for i in xrange(0, vtm.size): 
for k in xrange(0, vhs.size): 
    if all((k <= vhs.size) & (i <= vtm.size)): 
     lg1 = (TMf == vtm[i]) & (HSf == vhs[k]) 
     lg2 = sum(lg1) 
    if lg2>=1: 
     fg1 = text(i,k, str(lg2),horizontalalignment='center', verticalalignment='center',fontsize=6) 
    mmat[k,i] = lg2 
+0

Я думаю, что у меня был первый самый полный ответ, было то, что я представил то, что вы искали, или вы хотите, чтобы нулевой счет? –

ответ

1

Предлагаю использовать Counter, чтобы посчитать ваши пары.

from collections import Counter 

Hs = [0.5, 1.0, 2.3, 0.5, 0.5] 
Tm = [2.0, 2.5, 2.0, 2.0, 3.0] 

occurrences = Counter(zip(Hs, Tm)) 
for h in sorted(set(Hs)): 
    for t in sorted(set(Tm)): 
     print h, t, occurrences[(h,t)] 

Результат:

0.5 2.0 2 
0.5 2.5 0 
0.5 3.0 1 
1.0 2.0 0 
1.0 2.5 1 
1.0 3.0 0 
2.3 2.0 1 
2.3 2.5 0 
2.3 3.0 0 
1

Counter доступна в модуле коллекции для питона 2.7 на:

import collections 

Hs = [0.5, 1.0, 2.3, 0.5, 0.5] 

Tm = [2.0, 2.5, 2.0, 2.0, 3.0] 

pairs = zip(Hs, Tm) 

можно заархивировать итерируемых вместе, чтобы аккуратно соединить их:

>>> print(list(pairs)) 
[(0.5, 2.0), (1.0, 2.5), (2.3, 2.0), (0.5, 2.0), (0.5, 3.0)] 

Так

pairs = zip(Hs, Tm) 
counts = collections.Counter(pairs) 

print(counts) 

печатает:

Counter({(0.5, 2.0): 2, (1.0, 2.5): 1, (0.5, 3.0): 1, (2.3, 2.0): 1}) 

И поскольку Счетчик просто подкласс dict, мы можем tr съесть его как Dict:

for pair, count in counts.items(): 
    print(pair, count) 

распечатывает:

(1.0, 2.5) 1 
(0.5, 3.0) 1 
(0.5, 2.0) 2 
(2.3, 2.0) 1 

И если вы хотите, подсчет пар, которые не были там, доступ счетчик с парой так же, как ключ в Словаре:

counts[(1.0, 3.0)] 

возвращает

0 
0

Вы можете использовать collections.Counter для решения этой задачи

import collections 
import itertools 

hs = 0.5, 1.0, 2.3, 0.5, 0.5 
tn = 2.0, 2.5, 2.0, 2.0, 3.0 

pairCount = collections.Counter(itertools.izip(hs, tm)) 

print(pairCount) 

Если в результате что-то вроде:

Counter({(0.5, 2.0): 2, (1.0, 2.5): 1, (2.6, 2.0): 1, (0.5, 3.0): 1}) 
0

collections.Counter() будет подсчитывать количество ocerrances в итератор:

>>> import numpy as np 
>>> from collections import Counter 
>>> Hs = [0.5, 1.0, 2.3, 0.5, 0.5] 
>>> Tm = [2.0, 2.5, 2.0, 2.0, 3.0] 
>>> repeats = Counter(zip(Hs,Tm)) 
>>> 
>>> aHs = np.array(Hs) 
>>> aTm = np.array(Tm) 
>>> aRepeats = Counter(zip(aHs,aTm)) 
>>> aRepeats 
Counter({(0.5, 2.0): 2, (2.2999999999999998, 2.0): 1, (1.0, 2.5): 1, (0.5, 3.0): 1}) 
>>> 
>>> aRepeats[(0.5, 2.0)] 
2 
>>> repeats[(1.0, 2.5)] 
1 
>>> 
+0

Так что я был замедлен от стартового блока - не уверен, что я должен удалить это или нет. – wwii

Смежные вопросы