关于以下问题的后续问题:
如何在 Python 中使用 MATLAB 中的 unique(a, 'rows')?
那里的答案解释了如何获得唯一的行。然而,matlab 还返回创建的每一行的频率。任何用python制作的优雅方法?
谢谢!
您可以使用花哨的索引和评估以下条件来计算每个唯一行的数量:
from numpy import unique, array, all
def myunique(input):
u = array([array(x) for x in set(tuple(x) for x in input)])
return u, array([len(input[all(input==x, axis=1)]) for x in u],dtype=int)
例子:
a = array([list('1234'),
list('1234'),
list('1222'),
list('1222'),
list('1234')],dtype=str)
print myunique(a)
#(array([['1', '2', '2', '2'],
# ['1', '2', '3', '4']],
# dtype='|S1'), array([2, 3]))
numpy_indexed包(免责声明:我是它的作者)有一个功能可以有效地做到这一点:
import numpy_indexed as npi
m = np.random.randint(0, 2, (20, 3))
unique, count = npi.count(m)
我曾经遇到过这个问题。我做了以下事情:与其说是一个优雅的 hack,不如说是一个完美的解决方案。
首先将您的二维数组转换为一维数组或可散列列表,然后从那里很容易。转换为一维浮点数组的一种方法是使用 D 维随机向量进行点积。例如:
a = np.array([[1.32,1,4],[2,3,3.5],[1.32,1,4],[4,5,6.2]])
b = np.random.randint(1,10**20,3)
c = np.dot(a,b)
vals, idx = np.unique(c,True)