2012-04-04 258 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