将列表列表转换为numpy数组时,如何保持原始数据类型?
我使用np.array,np.matrix将列表转换成numpy数组。但事实证明,所有int都变为字符串。 Python版本是3.7.x。
X = [[3, 'aa', 10],
[1, 'bb', 22],
[2, 'cc', 28],
[5, 'bb', 32],
[4, 'cc', 32]]
# X is a list of list
X = np.array(X)
return X
# X becomes
[['3' 'aa' '10']
['1' 'bb' '22']
['2' 'cc' '28']
['5' 'bb' '32']
['4' 'cc' '32']]
答案 0 :(得分:3)
另一种选择是创建一个结构化的数组,混合使用整数和字符串字段。
In [252]: import numpy.lib.recfunctions as rf
In [258]: X = [[3, 'aa', 10],
...: [1, 'bb', 22],
...: [2, 'cc', 28],
...: [5, 'bb', 32],
...: [4, 'cc', 32]]
In [259]: dt = np.dtype('i,U10,i')
In [260]: dt
Out[260]: dtype([('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])
最新(1.16)numpy具有将非结构化数组(例如字符串dtype)转换为结构化函数的功能:
In [261]: Y = rf.unstructured_to_structured(np.array(X), dt)
In [262]: Y
Out[262]:
array([(3, 'aa', 10), (1, 'bb', 22), (2, 'cc', 28), (5, 'bb', 32),
(4, 'cc', 32)],
dtype=[('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])
通过名称访问字段:
In [264]: Y['f0']
Out[264]: array([3, 1, 2, 5, 4], dtype=int32)
In [265]: Y['f1']
Out[265]: array(['aa', 'bb', 'cc', 'bb', 'cc'], dtype='<U10')
将X
转换为元组列表同样有效
In [266]: np.array([tuple(row) for row in X], dtype=dt)
Out[266]:
array([(3, 'aa', 10), (1, 'bb', 22), (2, 'cc', 28), (5, 'bb', 32),
(4, 'cc', 32)],
dtype=[('f0', '<i4'), ('f1', '<U10'), ('f2', '<i4')])
对象数组和结构化数组各有优缺点。因此,哪个更好取决于您打算对数组执行的操作。因此,出于许多目的,原始列表可能同样有用。对于2D数值数组,没有一个具有相同的处理速度(用于数学运算)。
答案 1 :(得分:1)
改为使用string + integer
。然后每个项目都存储为Python对象。
答案 2 :(得分:1)
您可以使用以下任何一种方式:
X = np.array(X,dtype='object')
X = np.array(X,dtype=object)
X = np.array(X, dtype='O')
它们都起作用,所以整个代码:
X = [[3, 'aa', 10],
[1, 'bb', 22],
[2, 'cc', 28],
[5, 'bb', 32],
[4, 'cc', 32]]
# X is a list of list
One you picked
return X
P.S。 return
仅在函数中起作用,在函数之外,使用print