将 numpy 数组转换为 tuple

注意: 这要求与通常的 tuple-to-array 转换相反。

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

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

而下面的 不要

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

不幸的是,我想使用的参数是一个数字数组。对于某个 N,该数组的维数总是为2xN,这可能相当大。

有什么简单的方法可以把它转换成元组吗?我知道我可以循环访问,创建一个新的元组,但是我更希望有一些 numpy 数组提供的良好访问。

如果不可能像我希望的那样很好地完成这个任务,那么通过循环或者其他什么方式来完成这个任务的最佳方式是什么?

272395 次浏览
>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -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))

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

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

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

另一个选择

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

如果要将 NumPy 数组传递给 C + + 函数,那么还可以考虑使用 Cython 或 SWIG。

如果你喜欢长切,这里有另一种方法 Tuple (a _ m. tolist ()中 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 _ m 中 a _ m 的 tuple (a _ m. tolist ()))将给出一个生成器表达式。 受到@norok2对 Greg von Winckel 回答的评论的启发