【问题标题】:Numpy unique changes integer to stringNumpy unique 将整数更改为字符串
【发布时间】:2020-09-01 10:33:22
【问题描述】:

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

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)

【问题讨论】:

  • 您不能在一个数组中存储多种不同的数据类型。 ut 由于所有这些都可以是字符,python 将自动假定 char 并转换它们。如果你将它们分开存储,你会从整数中得到一个整数数组。
  • @jaSnom 不完全是“char”,但是是的,差不多
  • @juanpa.arrivillaga 是的,你是对的。在我的工作中同时使用 java nad python 有时会让我把它们混为一谈。
  • @juanpa.arrivillaga。从技术上讲,您可以使用带有元组的重新数组或对象数组
  • @MadPhysicist 当然,但从技术上讲,它们仍在存储同质数据类型、结构化数据类型或对象 :)

标签: python numpy unique


【解决方案1】:

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

unique_rows = set(test_data)

或者更好:

from collections import Counter

rows_and_counts = Counter(test_data)

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

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

【讨论】:

  • 根据您的回答,我想获取单独的键和值列表,例如:counted = Counter(test_data) 摘要、repeat = list(counted.keys())、list(counted.values ())。是否有任何可能的列表序列可以不同。
  • @kurag。不。字典的键和值总是以相同的顺序返回。这是合同的一部分。 Counter 是字典的子类。如果您真的担心,请summary = list(counted); repeat = [counted[k] for k in summary]
【解决方案2】:

你可以在 np.array 函数前面的 np.unique 中明确指定你的 dtype:

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')])

【讨论】:

  • 此数据来自sql表,因此我需要从sql表中获取数据类型,并添加到数据中。
  • @kurag 你为什么在这里使用numpy?无论如何,我不确定我是否理解这个答案的问题,为什么它来自 SQL 表有什么关系?
  • @wprazuch 数据取自 sql,并对其进行了一些操作,在某个阶段我需要多次(重复)的唯一行。我可以使用您的答案,但首先要控制原始数据类型。如果我这样做了,我也可以使用 Aratz 答案并进行修改,但你的答案会更短。但如果有的话,我正在寻找 numpy 本身的答案。就像我对 Aratz 说的,这应该是 numpy,numpy 之后的操作应该呈现原始结构,而不是经过编辑的版本。
  • @kurag 如果是这样的话,那么我现在什么都不想
  • @kurag。你明白np.unique 实际上效率不高吗? python set 或 Counter 具有更好的缩放性能
【解决方案3】:

我认为这与在 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))

【讨论】:

  • 感谢您的回答,但我认为这应该是 numpy 本身。这个数据表很大,字符串列可以是任意列,如果没有更短的方法我会写详细的解析函数。
猜你喜欢
  • 1970-01-01
  • 2015-10-24
  • 2013-09-15
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多