比较numpy数组中的行

2024-10-01 11:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个2dnumpy数组,我想知道我的数据集包含多少个唯一的行,以及每行的频率。解决这个问题的唯一方法是将整个数据集转换成一个字符串,然后进行比较,但肯定有更好的方法来实现这一点。感谢任何帮助。在

def getUniqueHaplotypes(self,data):
nHap=data.shape[0]
unique=dict() 
for i in range(nHap):
    s = "".join([str(j) for j in data[i]])
    if unique.has_key(s):
        unique[s]+=1
    else:
        unique[s] = 1

return unique

Tags: 数据方法字符串inselffordatadef
2条回答

我喜欢有帮助的解决方案:

def unique_rows(data):
    unique = dict()
    for row in data:
        row = tuple(row)
        if row in unique:
            unique[row] += 1
        else:
            unique[row] = 1
    return unique

它很快。我唯一关心的是:是否可以使用unique作为数组而不是dict()?如果不使用dictionary格式打印unique dictionary,我会遇到麻烦。 谢谢朱塞佩

查看^{}和{a2}。在

例如

import numpy as np
x = (np.random.random(100) * 5).astype(np.int)
unique_vals, indicies = np.unique(x, return_inverse=True)
counts = np.bincount(indicies)

print unique_vals, counts

你的问题,我读错了。。。在

获取唯一行的一种方法是将对象视为结构化数组。。。在

在你的例子中,你有一个二维数组的bools。所以也许是这样?在

^{pr2}$

当然,你最初的做法并没有错。。。只是为了展示一种稍微简洁的编写原始函数的方法(使用tuples,正如Justin建议的那样):

def unique_rows(data):
    unique = dict()
    for row in data:
        row = tuple(row)
        if row in unique:
            unique[row] += 1
        else:
            unique[row] = 1
    return unique

我们可以进一步使用defaultdict:

from collections import defaultdict
def unique_rows(data):
    unique = defaultdict(int)
    for row in data:
        unique[tuple(row)] += 1
    return unique

碰巧的是,这两种选择中的任何一种似乎都比“numpy thonic”的方式更快。。。)我早就猜到了!不过,像您在原始示例中所做的那样,将行转换为字符串是很慢的。你肯定想比较元组而不是字符串)。在

相关问题 更多 >