2017-07-10 2 views
0

インデックスのリストであるshape(3,600219)のnumpy配列を持っています。python最も一般的な3 x n配列のインデックス

すなわち

array([[ 0, 0, 0, ..., 2879, 2879, 2879], 
     [ 40, 40, 40, ..., 162, 165, 168], 
     [ 249, 250, 251, ..., 195, 196, 198]]) 

最初の行は、時間インデックスであり、2行目と3行目は、座標の指標です。私は、時間を無視して、どの座標のペアが最も頻繁に発生したのか把握しようとしています。

それは(49,249)か(40,250)...などでしたか?

+0

をあなたは、各コードの上に行くことによってO(N^2)でこれを行うとどのように多くを求めることができますそれが配列に現れる時間。あるいは、配列をソートしてコードを検索する方法と、O(N * log(N))で何をするかは少し複雑です。 – Yonlif

+0

あなたは最大の座標サイズを知っていますか? – Eric

答えて

4

私はちょうどあなたのデータの小さなサンプルを使用し、私はあなたがポイントを得ると思う:

import numpy as np 

array = np.array([[ 0, 0, 0, 2879, 2879, 2879], 
     [ 40, 40, 40, 162, 165, 168], 
     [ 249, 250, 251, 195, 196, 198]]) 

# Zip together only the second and third rows 
only_coords = zip(array[1,:], array[2,:]) 

from collections import Counter 

Counter(only_coords).most_common() 

が生成されます

Out[11]: 
[((40, 249), 1), 
((165, 196), 1), 
((162, 195), 1), 
((168, 198), 1), 
((40, 251), 1), 
((40, 250), 1)] 
+0

zipの行で 'list()'を呼び出すことはpython2のように非常に余計です。 'zip'はすでにリストを出力しています。そして' python3'では 'zip'は' Counter'でうまく動作するiterableを返します。大規模なデータセットの – jadsq

+0

@jadsq良いキャッチ... – blacksite

2

ここに1つのベクトル化のアプローチだ -

IDs = a[1].max()+1 + a[2] 
unq, idx, count = np.unique(IDs, return_index=1,return_counts=1) 
out = a[1:,idx[count.argmax()]] 

負の値がある場合は、a[1].max()-a[1].min()+1 + a[2]を使用してIDsを計算します。

サンプル実行 -

In [44]: a 
Out[44]: 
array([[8, 3, 6, 6, 8, 5, 1, 6, 6, 5], 
     [5, 2, 1, 1, 5, 1, 5, 1, 1, 4], 
     [8, 2, 3, 3, 8, 1, 7, 3, 3, 3]]) 

In [47]: IDs = a[1].max()+1 + a[2] 

In [48]: unq, idx, count = np.unique(IDs, return_index=1,return_counts=1) 

In [49]: a[1:,idx[count.argmax()]] 
Out[49]: array([1, 3]) 
0

例えば、これは少し抽象的に見えるかもしれませんが、あなたは数としてそれぞれの座標を保存してみてください[2,1] = 2.1。そしてあなたのデータをこれらの座標のリストに入れてください。プリント

from collections import Counter 
list1=[1.2,1.2,2.1] 
data = Counter(list1) 
print (data.most_common(1)) # Returns the highest occurring item 

:例えば、[2,2,1]の[1,1,2]の2行目と3行目は、あなたは、コードを使用することができる[1.2、1.2、2.1]であろう最も一般的な数、そして何回発生するのか、コードで使用する必要がある場合は、単純に数値を座標に戻すことができます。

0
ここ

は、カウントしたサンプルコードです:

import numpy as np 
import collections 

a = np.array([[0, 1, 2, 3], [10, 10, 30 ,40], [25, 25, 10, 50]]) 
# You don't care about time 
b = np.transpose(a[1:]) 

# convert list items to tuples 
c = map(lambda v:tuple(v), b) 
collections.Counter(c) 

出力:

Counter({(10, 25): 2, (30, 10): 1, (40, 50): 1}) 
関連する問題