【问题标题】:Convert numpy array to tuple将numpy数组转换为元组
【发布时间】:2012-04-18 11:16:43
【问题描述】:

注意:这要求与通常的元组到数组的转换相反。

我必须将参数作为嵌套元组传递给(包装的 c++)函数。例如,以下作品

X = MyFunction( ((2,2),(2,-2)) )

而以下

X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )

不幸的是,我想使用的参数是一个 numpy 数组。对于某些 N,该数组的维度始终为 2xN,这可能非常大。

有没有一种简单的方法可以将其转换为元组?我知道我可以循环,创建一个新的元组,但如果 numpy 数组提供了一些不错的访问,我会更喜欢。

如果不能像我希望的那样完美地做到这一点,那么通过循环或其他方式来做到这一点最漂亮的方法是什么?

【问题讨论】:

    标签: python numpy


    【解决方案1】:
    >>> arr = numpy.array(((2,2),(2,-2)))
    >>> tuple(map(tuple, arr))
    ((2, 2), (2, -2))
    

    【讨论】:

    • 所以对于一个简单的一维数组tuple(arr)
    【解决方案2】:

    这是一个可以做到这一点的函数:

    def totuple(a):
        try:
            return tuple(totuple(i) for i in a)
        except TypeError:
            return a
    

    还有一个例子:

    >>> array = numpy.array(((2,2),(2,-2)))
    >>> totuple(array)
    ((2, 2), (2, -2))
    

    【讨论】:

    • 很好的概括。不过,作为一个 python 新手,我想知道在几乎与非异常状态一样常见的情况下使用异常是否被认为是一种好的风格。至少在 C++ 中,异常流控制通常是不被接受的。测试type(a)==numpy.ndarray是否会更好?
    • 这在 python 中很常见,因为“duck-typing”和 EAFT 的概念,更多信息在这里:docs.python.org/glossary.html#term-duck-typing。这种方法的优点是它将任何嵌套序列转换为嵌套元组,而不仅仅是一个数组。我应该做的一件我已经修复的事情是指定我希望由 except 块处理哪些错误。
    • 在 C++ 中,由于各种原因,异常相对于条件来说很慢。在 Python 中,它们在性能方面大致相同——这是我们必须在门口检查 C++ 直觉的地方之一。
    • 这个解决方案是我需要的 100%。谢谢!
    【解决方案3】:

    我不满意,所以我最后用了这个:

    >>> a=numpy.array([[1,2,3],[4,5,6]])
    >>> a
    array([[1, 2, 3],
           [4, 5, 6]])
    
    >>> tuple(a.reshape(1, -1)[0])
    (1, 2, 3, 4, 5, 6)
    

    我不知道它是否更快,但它看起来更有效;)

    【讨论】:

    • 这不是我想要的元组形状。
    【解决方案4】:

    另一种选择

    tuple([tuple(row) for row in myarray])
    

    如果您将 NumPy 数组传递给 C++ 函数,您可能还希望考虑使用 Cython 或 SWIG。

    【讨论】:

    • 这不会转换为元组。转换为列表?
    • 你试过了吗?当我运行时它会生成一个元组。注意最后调用的函数是元组,它返回一个元组。如果你只有 [...] 部分没有外部元组,你会得到一个元组列表。
    • 有更快的方法吗?
    • 您可以通过省略方括号来避免创建中间list,即使用tuple(tuple(row) for row in myarray)
    【解决方案5】:

    如果你喜欢长切,这里有另一种方法 tuple(tuple(a_m.tolist()) for a_m in a )

    from numpy import array
    a = array([[1, 2],
               [3, 4]])
    tuple(tuple(a_m.tolist()) for a_m in a )
    

    输出是 ((1, 2), (3, 4))

    注意 (tuple(a_m.tolist()) for a_m in a ) 将给出生成器表达式。 受到@norok2 对 Greg von Winckel's answer的评论的启发

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多