将numpy数组转换为元组

Mik*_*ike 95 python numpy

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

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

X = MyFunction( ((2,2),(2,-2)) )
Run Code Online (Sandbox Code Playgroud)

而以下则没有

X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )
Run Code Online (Sandbox Code Playgroud)

不幸的是,我想要使用的论点是一个numpy数组.对于某些N,该数组总是具有2xN的尺寸,这可能非常大.

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

如果不可能像我希望的那样做得很好,通过循环或其他什么方式来做最漂亮的方法呢?

Nik*_* B. 136

>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -2))
Run Code Online (Sandbox Code Playgroud)

  • 所以对于一个简单的1-d数组`元组(arr)` (18认同)

Bi *_*ico 25

这是一个可以做到的功能:

def totuple(a):
    try:
        return tuple(totuple(i) for i in a)
    except TypeError:
        return a
Run Code Online (Sandbox Code Playgroud)

一个例子:

>>> array = numpy.array(((2,2),(2,-2)))
>>> totuple(array)
((2, 2), (2, -2))
Run Code Online (Sandbox Code Playgroud)

  • 这在python中很常见,因为"鸭子打字"和EAFT的概念,更多在这里:http://docs.python.org/glossary.html#term-duck-typing.这种方法的优点是它可以将任何嵌套序列转换为嵌套元组,而不仅仅是数组.我应该做的一件事我已经修复了指定我想要由except块处理哪些错误. (8认同)
  • 很好的概括。不过,作为一个 python 新手,我想知道在几乎与非异常状态一样常见的条件下使用异常是否被认为是好的风格。至少在 C++ 中,通过异常进行流控制通常是不受欢迎的。测试是否“type(a)==numpy.ndarray”会更好吗? (3认同)
  • 在C++中,由于各种原因,相对于条件的异常是缓慢的.在Python中,它们在性能方面大致相同 - 这是我们在门口检查C++直觉的地方之一. (2认同)

小智 7

我不满意,所以我终于用了这个:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是我想要的元组形状. (3认同)

Gre*_*kel 6

另外一个选项

tuple([tuple(row) for row in myarray])
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以通过省略方括号来避免创建中间“列表”,即使用“tuple(tuple(row) for row in myarray)” (6认同)

Tej*_*tty 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 )
Run Code Online (Sandbox Code Playgroud)

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

请注意, (tuple(a_m.tolist()) for a_m in a ) 将给出生成器表达式。有点受到 @norok2 对Greg von Winckel 答案的评论的启发