在Python

时间:2015-11-15 20:23:53

标签: python arrays numpy data-structures tuples

如何有效地将numpy.float64的数组数组转换为float元组的元组

输入

a = array([array([1.]), array([2, 3]), array(['a', 'b', 'c'])])

其中值为numpy基本类型,例如numpy.float64numpy.int32numpy.str_等。

输出

((1.,), (2, 3), ('a', 'b', 'c'))

其中值为原生类型floatintstr,...

我想可能存在递归和迭代方法......任何想法?

2 个答案:

答案 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

当我们将它们应用于二维数组时,更多关于listtolist之间的区别:

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