numpy配列をタプルに変換します


108

注:これは、通常のタプルから配列への変換の逆を求めています。

(ラップされたc ++)関数にネストされたタプルとして引数を渡す必要があります。たとえば、次の作品

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

一方、以下はしません

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

残念ながら、私が使用したいという議論は、数の多い配列として私に来ます。その配列は常に、いくつかのNに対して2xNの次元を持ちます。

それをタプルに変換する簡単な方法はありますか?ループして新しいタプルを作成できることはわかっていますが、numpy配列が提供する適切なアクセスがあるとよいでしょう。

私が望むほどうまくこれを行うことができない場合、ループなどでそれを行うための最も美しい方法は何ですか?

回答:



26

これを行う関数は次のとおりです。

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
マイク

9
「ダックタイピング」とEAFTの概念のため、これはpythonでかなり一般的です。詳細については、docs.python.org/glossary.html#term-duck-typingを参照してください。このアプローチの利点は、配列だけでなく、ネストされたシーケンスをネストされたタプルに変換することです。修正したことの1つは、exceptブロックで処理するエラーを指定することです。
Bi Rico

2
C ++では、さまざまな理由により、例外は条件文に比べて遅くなります。Pythonでは、パフォーマンスに関してほぼ同じです。これは、C ++の直観をドアで確認する必要がある場所の1つです。
dbn 2015年

8

私は満足していなかったので、最終的にこれを使用しました:

>>> 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
それは私がタプルに求めていた形ではありませんでした。
マイク

5

別のオプション

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

NumPy配列をC ++関数に渡す場合は、CythonまたはSWIGの使用も検討してください。


それはタプルに変換されません。リストに変換しますか?
Peter

やってみましたか?実行するとタプルが作成されます。呼び出される最後の関数はタプルで、タプルを返すことに注意してください。[...]部分だけがあり、外側のタプルがない場合は、タプルのリストが表示されます。
グレッグフォンヴィンケル2015

より速い方法はありますか?
Vicrobot、

1
list角かっこを省略して、つまり、tuple(tuple(row) for row in myarray)
norok2

1

あなたがロングカットが好きなら、ここに別の方法がありますtuple(tuple(a_m.tolist())for a_m for 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))です

(aのa_mの場合、(tuple(a_m.tolist()))はジェネレータ表現を与えることに注意してください。グレッグ・フォン・ウィンケルの回答に対する @ norok2のコメントに触発されたようなもの

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.