【问题标题】:Convert arrays (of numpy data types) to tuples (of native data types) in Python在 Python 中将数组(numpy 数据类型)转换为元组(本机数据类型)
【发布时间】:2015-11-15 20:23:53
【问题描述】:

如何有效地将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、...

我想可能有递归和迭代的方法......有什么想法吗?

【问题讨论】:

    标签: python arrays numpy data-structures tuples


    【解决方案1】:

    拥有一个由不同大小和类型的数组组成的 numpy 数组通常表明您的设计出现问题。但是,如果出于某种原因,您可以使用 .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'>]
    

    【讨论】:

    • 谢谢!又好又干净!
    【解决方案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')]
    

    【讨论】:

    • 谢谢。似乎numpy 基本数据结构仍然存在。例如,type(tuple([tuple(i) for i in a])[0][0]) 产生 numpy.float64,但必须是 float(只是原生数据类型)。
    • 我忘记了list(a)a.tolist() 之间的区别。后者是递归转换器。试试我的编辑。
    • 我添加内容时没有注意到您的回答。
    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2017-06-28
    • 2021-11-13
    • 2023-03-11
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多