私は次のことをしようとしています。
XとYの2つの2D配列があります。それぞれが100x100要素です。それらを10,000x1列に線形化/フラット化してから連結したいので、10,000x2の単一の行列が残ります。MATLABでは、次のことができます
BigMatrix = [X(:) Y(:)]
Pythonでも同じことをしたいです。少し遊んだ後、以下に示すように、非常に冗長な方法ではありますが、MATLABの結果を複製することができました。これを達成するためのより良い、より簡潔な方法はありますか?
BigMatrix = np.concatenate(
(X.reshape((10000,1), order = 'F'),
Y.reshape((10000,1), order = 'F')),
axis=1)
あなたが望むものを達成するための複数の方法があり、あなたが持っているものは完全に有効です。ただし、他にも「簡潔」な方法がいくつかあります。
np.ndarray.flatten
1次元に折りたたまれた配列のコピーを返します。
列メジャーとして扱うか行メジャーとして扱うかを指定することもできます。
必要な結果(amx 2行列、各平坦化された行列を列として)を取得するには、次を使用できます。 numpy.column_stack
BigMatrix = np.column_stack([X.flatten(order = 'F'), Y.flatten(order = 'F')])
または、@ sspが述べたように、本当に簡潔なものを探している場合は、numpyインデックスルーチン(基本的にスライスに特別な動作を与える)を使用できます。連結には2つあり、各軸に1つあります。r_
は行方向(最初の軸)c_
用で、列方向(2番目の軸)用なので、mx2行列を取得するには次のようにします。
BigMatrix = np.c_[X.flatten(order = 'F'), Y.flatten(order = 'F')]
@hpauljが示唆しているように、パフォーマンスに関しては、元のコードを使用したほうがよい場合があります。これは、3つのメソッドの簡単なタイミングです。各メソッドは、100x100マトリックスのサイズに対して100万回実行されます。
from timeit import timeit
print("c_ w/ flatten", timeit(
setup="import numpy as np\nX=np.random.standard_normal((100,100))\nY=np.random.standard_normal((100,100))",
stmt="Z=np.c_[X.flatten(order='F'), Y.flatten(order='F')]"
))
print("column_stack w/ flatten", timeit(
setup="import numpy as np\nX=np.random.standard_normal((100,100))\nY=np.random.standard_normal((100,100))",
stmt="Z=np.column_stack((X.flatten(order='F'), Y.flatten(order='F')))"
))
print("concatenate w/ reshape", timeit(
setup="import numpy as np\nX=np.random.standard_normal((100,100))\nY=np.random.standard_normal((100,100))",
stmt="Z=np.concatenate((X.reshape((10000,1),order='F'), Y.reshape((10000,1),order='F')), axis=1)"
))
そして私達は得る
c_ w/ flatten 44.47710300699691
column_stack w/ flatten 29.201319813000737
concatenate w/ reshape 27.67507728200144
驚いたことに、column_stackとflattenは同等ですが、インデックスルーチンは大幅に低速です。
(このパフォーマンス分析で見逃したことがあれば、教えてください。私はパフォーマンスの第一人者ではありません)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加