Python Numpy unique将整数更改为字符串

Python Numpy unique将整数更改为字符串,python,numpy,unique,Python,Numpy,Unique,我有一个包含字符串和整数列的数据表,例如: test_data = [('A',1,2,3),('B',4,5,6),('A',1,2,3)] 我需要唯一的行,因此我使用了numpy unique函数: summary, repeat = np.unique(test_data,return_counts=True, axis=0) 但在那之后,我的数据类型就改变了。总结如下: array([['A', '1', '2', '3'], ['B', '4', '5', '6']], dt

我有一个包含字符串和整数列的数据表,例如:

test_data = [('A',1,2,3),('B',4,5,6),('A',1,2,3)]
我需要唯一的行,因此我使用了numpy unique函数:

summary, repeat = np.unique(test_data,return_counts=True, axis=0)
但在那之后,我的数据类型就改变了。总结如下:

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

['B','4','5','6']],dtype='我认为这与以下事实有关:在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.unique前面的np.array函数中显式指定您的数据类型:

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

test_data=np.array(test_data,dtype=[('letter','如果您有python对象,并且希望将它们保留为python对象,请使用python函数:

unique_rows = set(test_data)
或者更好:

from collections import Counter

rows_and_counts = Counter(test_data)
这些解决方案不复制数据:它们保留对原始元组的引用,就像它们一样。numpy解决方案多次复制数据:在转换为numpy时复制一次,在排序时复制至少一次,在转换回numpy时复制更多


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

不能在一个数组中存储多个不同的数据类型。但由于所有这些数据类型都可以是字符,python将自动假定为字符并将其转换。如果将它们分开存储,则会从整数中得到一个整数数组。@jaSnom不完全是“字符”但是是的,很漂亮much@juanpa.arrivillaga是的,你是对的。在我的工作中同时使用java和python有时会使我混淆它们。@juanpa.arrivillaga。从技术上讲,你可以使用tuples@MadPhysicist当然可以,但从技术上讲,它们仍在存储同质数据类型、结构化数据类型或对象:)谢谢您的回答,但我认为这应该是numpy本身。这个数据表很大,字符串列可以是任何列,因此如果没有更短的方法,我将编写详细的解析函数。这些数据来自sql表,因此我需要从sql表中获取数据类型,并添加到数据中。@kurag为什么在这里使用
numpy
?在任何情况下,我不确定我是否理解这个答案的问题,为什么它来自SQL表有关系?@wprazuch从SQL中获取数据,并对其进行了一些操作,在某个阶段我需要多次唯一的行(重复)。我可以使用你的答案,但首先控制原始数据类型。如果我这样做了,我也可以使用Aratz答案并进行修改,但你的答案会更短。但我正在寻找numpy本身的答案,如果有。就像我对Aratz说的,这应该在numpy中,numpy操作后应该呈现原始结构,而不是编辑版本如果是这样的话,那我就什么都不想了now@kurag.您确实了解
np.unique
实际上并没有那么有效?python集或计数器具有更好的缩放性能基于您的回答,我希望将键和值的列表分开,例如:counted=Counter(test_data)summary,repeat=list(counted.keys()),list(counted.values())。是否有可能列表的顺序会不同。@kurag.No.字典的键和值总是按相同的顺序返回。这是合同的一部分。计数器是字典的一个子类。如果您真的担心,请执行
summary=list(counted);repeat=[counted[k]对于总结中的k]
unique_rows = set(test_data)
from collections import Counter

rows_and_counts = Counter(test_data)