如何有效地将numpy.float64
的数组数组转换为float
元组的元组
输入
a = array([array([1.]), array([2, 3]), array(['a', 'b', 'c'])])
其中值为numpy
基本类型,例如numpy.float64
,numpy.int32
,numpy.str_
等。
输出
((1.,), (2, 3), ('a', 'b', 'c'))
其中值为原生类型float
,int
,str
,...
我想可能存在递归和迭代方法......任何想法?
答案 0 :(得分:3)
拥有不同大小和类型的数组阵列通常是设计中出现问题的标志。但是如果由于某种原因你得到了它,你可以使用.tolist()
将numpy数组转换为列表,同时将类型更改为Python本地数组。例如:
>>> a = array([array([1.]), array([2, 3]), array(['a', 'b', 'c'])])
>>> a
array([array([ 1.]), array([2, 3]),
array(['a', 'b', 'c'],
dtype='<U1')], dtype=object)
>>> t = tuple(tuple(x.tolist()) for x in a)
>>> t
((1.0,), (2, 3), ('a', 'b', 'c'))
我们在哪里
>>> [type(x[0]) for x in a]
[<class 'numpy.float64'>, <class 'numpy.int32'>, <class 'numpy.str_'>]
但现在有
>>> [type(x[0]) for x in t]
[<class 'float'>, <class 'int'>, <class 'str'>]
答案 1 :(得分:2)
列表理解可以很好地完成工作:
In [191]: a = np.array([np.array([1.]), np.array([2, 3]), np.array(['a', 'b', 'c'])])
In [192]: a
Out[192]:
array([array([ 1.]), array([2, 3]),
array(['a', 'b', 'c'],
dtype='<U1')], dtype=object)
In [193]: [tuple(i) for i in a]
Out[193]: [(1.0,), (2, 3), ('a', 'b', 'c')]
In [194]: tuple([tuple(i) for i in a])
Out[194]: ((1.0,), (2, 3), ('a', 'b', 'c))
将数组列表包装在另一个数组层中并没有多大作用。 dtype对象的数组只是一个带有ndarray
包装器的列表。 a
的大多数操作都会将其视为列表。
In [195]: ll=[np.array([1.]), np.array([2, 3]), np.array(['a', 'b', 'c'])]In [196]: ll
Out[196]:
[array([ 1.]), array([2, 3]), array(['a', 'b', 'c'],
dtype='<U1')]
In [197]: [tuple(l) for l in ll]
Out[197]: [(1.0,), (2, 3), ('a', 'b', 'c')]
更正 - 如果我们想要转换内部数组的元素,我们首先需要使用tolist()
。 tuple(i)
与list(i)
类似,在第一维上进行迭代,而i.tolist()
进行递归转换。
In [204]: type([tuple(i.tolist()) for i in a][0][0])
Out[204]: float
当我们将它们应用于二维数组时,更多关于list
和tolist
之间的区别:
In [210]: np.ones((2,3)).tolist()
Out[210]: [[1.0, 1.0, 1.0], [1.0, 1.0, 1.0]]
In [211]: list(np.ones((2,3)))
Out[211]: [array([ 1., 1., 1.]), array([ 1., 1., 1.])]
In [212]: tuple(np.ones((2,3)))
Out[212]: (array([ 1., 1., 1.]), array([ 1., 1., 1.]))
没有totuple()
方法,并且没有任何快速简便的方法可以将嵌套的列表列表转换为嵌套的元组元组。
tolist
不会通过dtype=object
图层递归:
In [214]: a.tolist()
Out[214]:
[array([ 1.]), array([2, 3]), array(['a', 'b', 'c'],
dtype='<U1')]