137

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

我必须将参数作为嵌套元组传递给(包装的 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 数组提供了一些不错的访问,我会更喜欢。

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

4

5 回答 5

199
>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -2))
于 2012-04-04T17:35:41.920 回答
35

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

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))
于 2012-04-04T17:52:23.107 回答
12

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

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

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

于 2013-08-12T13:35:06.367 回答
6

另外一个选项

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

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

于 2014-05-01T18:50:15.230 回答
4

如果你喜欢长切,这里有另一种方式 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 回答的评论的启发

于 2020-02-19T10:41:21.967 回答