【问题标题】:Numpy transpose converts entries to strings?Numpy转置将条目转换为字符串?
【发布时间】:2017-11-20 03:00:39
【问题描述】:

我有一个数组,它的条目是整数和字符串的混合。我想使用 numpy 转置它,但是当我这样做时,int 似乎变成了字符串。

In [47]: X

Out[47]: [['a', 1, 2], ['b', 1, 3]]

In [48]: np.transpose(X)

Out[48]:
array([['a', 'b'],
       ['1', '1'],
       ['2', '3']],
      dtype='<U1')

我真的希望输出是:

[['a','b'],[1,1],[2,3]]

(我可以通过编写更多代码来修复它,但我认为这很烦人而且不是好习惯。虽然如果有一两行修复也会有帮助。我也想知道什么numpy 正在做这个,以及如何让它按照我想要的方式工作。)

编辑:

我注意到这发生在我将 X 转换为 numpy 数组时:

In [50]: X = np.array(X)

In [51]: X
Out[51]:
array([['a', '1', '2'],
       ['b', '1', '3']],
      dtype='<U1')

EDIT2:已解决:

In [55]: Y = np.asarray(X, dtype = object)

In [56]: Y
Out[56]:
array([['a', 1, 2],
       ['b', 1, 3]], dtype=object)
In [57]: Y.T
Out[57]:
array([['a', 'b'],
       [1, 1],
       [2, 3]], dtype=object)

【问题讨论】:

  • 尝试使用 dtype 作为对象
  • 实际上混合字符串和整数的 numpy 数组并不是一个好习惯。切换到object dtype 有效,但失去了数组的大部分优点(例如快速数值计算)。
  • np.transpose(X) 实际上是np.array(X).transpose()。大多数numpy 函数一开始就确保它们的输入是数组。

标签: python arrays numpy


【解决方案1】:

问题似乎出在 X 转换为 np.array 时。如果要将 X 转换为具有混合类型的 numpy 数组,请使用 dtype = object:Numpy dtype for list with mixed data types

In [55]: Y = np.asarray(X, dtype = object)

In [56]: Y
Out[56]:
array([['a', 1, 2],
       ['b', 1, 3]], dtype=object)
In [57]: Y.T
Out[57]:
array([['a', 'b'],
       [1, 1],
       [2, 3]], dtype=object)

【讨论】:

    【解决方案2】:

    有时使用对象数组不如使用结构化数组。如果您想走这条路,只需将列表列表转换为元组列表,然后按以下步骤操作:

    a = [['a', 1, 2], ['b', 1, 3]]
    a = [tuple(i) for i in a]
    a
    [('a', 1, 2), ('b', 1, 3)]
    
    dt = [('A', '<U5'), ('B', '<i4'), ('C', '<i4')]
    b = np.asarray(a, dtype=dt)
    array([('a', 1, 2), ('b', 1, 3)], 
          dtype=[('A', '<U5'), ('B', '<i4'), ('C', '<i4')])
    

    那么字段/列是有用的

    b['B']
    array([1, 1])
    
    b['B'].sum()
    2
    

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 2016-03-10
      • 1970-01-01
      • 2021-04-26
      • 2015-03-28
      • 1970-01-01
      • 2019-11-24
      • 2016-03-24
      • 1970-01-01
      相关资源
      最近更新 更多