2012-04-04 178 views
68

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

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

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

而以下

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

不幸的是,我想用参数来我作为一个numpy的阵列。该阵列对于某些N总是具有2×N的尺寸,这可能相当大。

有没有简单的方法将它转换为元组?我知道我可以循环,创建一个新的元组,但宁愿如果numpy数组提供了一些很好的访问。

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

回答

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

下面是会做的一个功能:

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

好泛化。不过,作为一名python新手,我想知道是否将异常用于非常规状态几乎同样常见的情况,是否被认为是很好的风格。至少在C++中,异常流量控制通常是不被接受的。测试'type(a)== numpy.ndarray'是否会更好? – Mike 2012-04-05 15:36:21

+8

由于“duck-typing”和EAFT的概念,这在python中很常见,在这里更多:http://docs.python.org/glossary.html#term-duck-typing。这种方法的优点是它可以将任何嵌套序列转换为嵌套元组,而不仅仅是一个数组。我应该做的一件事,我已经解决了,指定我想要由except块处理哪些错误。 – 2012-04-05 16:53:30

+2

在C++中,由于各种原因,异常相对于条件很慢。在Python中,它们在性能方面大致相同 - 这是我们必须检查C++直觉的地方之一。 – dbn 2015-11-19 23:02:08

0

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

I:A = numpy.array([[1,2,3],[4,5,6]])

i均有:一个

○:阵列([[1,2,3 ], [4,5,6]])

I:元组(a.reshape(1,-1)[0])

○:(1,2,3,4,5, 6)

我不知道,如果它的速度更快,但它看起来更加有效;)

+2

这不是我想要的元组形状。 – Mike 2013-08-12 18:32:16

1

另一种选择

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

如果您传递与NumPy阵列C++函数,你也不妨来看看使用用Cython或痛饮。

+0

这不会转换为元组。转换为列表? – Peter 2015-09-23 04:54:55

+0

你试过了吗?它在我运行时形成一个元组。请注意,最后一个调用的函数是元组,它返回一个元组。如果你只有没有外层元组的部分,你会得到一个元组列表。 – 2015-09-24 14:26:24

+0

对此感到抱歉;你是对的。昨晚我有点困了,看到一个列表返回,所以是的,它一定是一个内含元组的列表。 – Peter 2015-09-24 16:01:45