我有一个数组,其条目是int和字符串的混合。我想用numpy转置它,但是当我这样做时,它似乎变成了字符串。
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)
答案 0 :(得分: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)
答案 1 :(得分:1)
有时使用对象数组比使用结构化数组更不可取。如果您想要去那条路线,只需将列表列表转换为元组列表,然后按以下步骤操作:
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