列表推导很好地完成了这项工作:
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')]