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)
复杂性。
我有数据 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)
复杂性。