python 3 x n 数组中最常见的一对索引
python most common pair of indices in 3 x n array
我有一个形状为 (3, 600219) 的 numpy 数组,它是一个索引列表。
即
array([[ 0, 0, 0, ..., 2879, 2879, 2879],
[ 40, 40, 40, ..., 162, 165, 168],
[ 249, 250, 251, ..., 195, 196, 198]])
第一行是时间索引,第二行和第三行是坐标索引。我试图找出最常出现的坐标对,而不考虑时间。
例如是 (49,249) 还是 (40,250)...等等?
我只是使用了你数据的一小部分样本,但我想你会明白要点的:
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)]
这是一种矢量化方法 -
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])
这可能看起来有点抽象,但您可以尝试将每个坐标保存为一个数字,例如[2,1] = 2.1。并将您的数据放入这些坐标的列表中。例如,[1,1,2] 的第二行和 [2,2,1] 的第三行将是 [1.2, 1.2, 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
它打印最常见的数字,以及它出现的次数,如果您需要在代码中使用它,您可以简单地将数字转换回坐标。
这是一个进行计数的示例代码:
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})
我有一个形状为 (3, 600219) 的 numpy 数组,它是一个索引列表。
即
array([[ 0, 0, 0, ..., 2879, 2879, 2879],
[ 40, 40, 40, ..., 162, 165, 168],
[ 249, 250, 251, ..., 195, 196, 198]])
第一行是时间索引,第二行和第三行是坐标索引。我试图找出最常出现的坐标对,而不考虑时间。
例如是 (49,249) 还是 (40,250)...等等?
我只是使用了你数据的一小部分样本,但我想你会明白要点的:
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)]
这是一种矢量化方法 -
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])
这可能看起来有点抽象,但您可以尝试将每个坐标保存为一个数字,例如[2,1] = 2.1。并将您的数据放入这些坐标的列表中。例如,[1,1,2] 的第二行和 [2,2,1] 的第三行将是 [1.2, 1.2, 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
它打印最常见的数字,以及它出现的次数,如果您需要在代码中使用它,您可以简单地将数字转换回坐标。
这是一个进行计数的示例代码:
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})