将numpy数组转换为元组

时间:2012-04-04 17:33:56

标签: python numpy

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

我必须将一个参数传递给(包装的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数组提供的一些不错的访问。

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

5 个答案:

答案 0 :(得分:121)

>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -2))

答案 1 :(得分:24)

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

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

答案 2 :(得分:6)

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

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

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

答案 3 :(得分:3)

另一个选择

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

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

答案 4 :(得分:1)

如果您喜欢大刀阔斧,这是另一种方式 tuple(a中a_m的元组(tuple(a_m.tolist()))

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

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

仅注意(a中的a_m的元组(a_m.tolist()))将给出生成器表达。 @ norok2对 Greg von Winckel's answer的评论颇为启发