Numpy unique 将整数更改为字符串

Numpy unique changes integer to string

我有数据 table,其中包含字符串和整数列,例如:

test_data = [('A',1,2,3),('B',4,5,6),('A',1,2,3)]

我需要唯一的行,因此我使用了 numpy 的唯一函数:

summary, repeat = np.unique(test_data,return_counts=True, axis=0)

但之后我的数据类型发生了变化。摘要是:

array([['A', '1', '2', '3'],
   ['B', '4', '5', '6']], dtype='<U1')

所有数据类型现在都是字符串。我怎样才能阻止这种变化? (Python 3.7,numpy 1.16.4)

我认为这与这样一个事实有关,即在 numpy 数组中,所有项目都必须具有相同的类型,您可以做的是尝试在结果从 numpy 出来时解析回您的结果,例如:

result = []
for l in summary.tolist():
    new_l = []
    for v in l:
        try:
            new_l.append(int(v))
        except ValueError:
            new_l.append(v)
    result.append(tuple(new_l))

您可以在 np.array 函数之前明确指定您的 dtype np.unique:

test_data = [('A',1,2,3),('B',4,5,6),('A',1,2,3)]

test_data = np.array(test_data, dtype=[('letter', '<U1'),
                                ('x', np.int),
                                 ('y', np.int),
                                 ('z', np.int)])
                                 
summary, repeat = np.unique(test_data,return_counts=True, axis=0)

总结如下:

array([('A', 1, 2, 3), ('B', 4, 5, 6)],
      dtype=[('letter', '<U1'), ('x', '<i4'), ('y', '<i4'), ('z', '<i4')])

如果您有 python 个对象并且想要将它们保留为 python 个对象,请使用 python 函数:

unique_rows = set(test_data)

或者更好:

from collections import Counter

rows_and_counts = Counter(test_data)

这些解决方案不复制数据:它们保留对原始元组的引用。 numpy 解决方案多次复制数据:转换为 numpy 时一次,排序时至少一次,转换回来时可能更多。

这些解决方案具有 O(N) 算法复杂性,因为它们都使用散列 table。 numpy unique 解决方案使用排序,因此具有 O(N log N) 复杂性。