配列へのナンピー行列


149

私はnumpyを使用しています。1列N行の行列があり、N個の要素を持つ配列を取得したいと考えています。

たとえば、私が持っている場合、私はM = matrix([[1], [2], [3], [4]])取得したいですA = array([1,2,3,4])

それを達成するために、私はを使用しますA = np.array(M.T)[0]。同じ結果を得るためのよりエレガントな方法を知っている人はいますか?

ありがとう!


回答:


192

もう少し読みやすくしたい場合は、これを行うことができます:

A = np.squeeze(np.asarray(M))

同様に、次のこともできます:A = np.asarray(M).reshape(-1)、しかしそれは少し読みにくいです。


9
私の側にはほとんど怒りが...なぜnumpyは別々のエンティティとして配列と行列を持っているのですか?それはとても不器用な私見です。このヒントをありがとう@Joe。
ナイジャバ2015

6
@Naijaba-価値があるのは、行列クラスが(正式ではなく)実質的に減価償却されることです。それは主に歴史的な目的のためにあります。削除numpy.matrixはやや論争の多い問題ですが、numpyの開発者は、両方を使用することは多くの理由で不便で迷惑であることに同意します。ただし、使用されている「野生の」古い、メンテナンスされていないコードの量により、matrix完全に削除することは困難です。
ジョー・キントン

1
言うまでもなく、真の行列乗算はNumpy 1.10の配列にのみ追加され、基本的にはまだベータ版です。これは、多くの人(私を含む)が、私たちがやりたいことを実行するために、配列ではなく行列を使用する必要があることを意味します。docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
スパース行列は、メモリ効率の高い機械学習の基本です(例:)sklearn。実際、にはさまざまなsparse matrixタイプがありscipy、行または列を介して効率的にアクセスできます。これは、行列と配列の概念をマージするための問題かもしれないと思います。とはいえ、導入できるかどうかは疑問ですsparse array型ています。手がかりはありますか?
pms 2017年

最後に1D配列が必要な限り、.flatten()は.squeeze()と同様に機能すると思います。
wordsthewiseの

122

6
私はこの答えは、受け入れられた答えよりも優れていると思います。パフォーマンスの点で、シンプルです
dariush

M.A1は素晴らしく、「ravel」や「flatten」と同じ実装であり、この場合、データコピーは発生しません。したがって、AやMが変更可能である場合、AはMにリンクされたままになり、驚きを引き起こす可能性があります。M.flat本物の代替の「flatiter」ジェネレータを返す(読み取り専用のセマンティクス)np.squeeze(M)#サイズ1の次元を削除するビューを提供しますが、ここでも大丈夫ですが、一般的なM np.reshape( M、-1)#は通常、形状の互換性に応じたビューです。この「-1」は、A1 /
ravel

13
A, = np.array(M.T)

エレガンスとはどういう意味かによって異なりますが、それは私がすることです


11

次のバリアントを試すことができます。

result=np.array(M).flatten()


6

または、いくつかの臨時雇用者を回避しようとすることができます

A = M.view(np.ndarray)
A.shape = -1

2

最初にMv = numpy.asarray(M.T)、4x1で2Dの配列を提供します。

次に、を実行しますA = Mv[0,:]。これにより、必要なものが得られます。のようにまとめることができnumpy.asarray(M.T)[0,:]ます。



0

ラヴェル()平ら() numpyのの機能は、私はここにしようとするだろうという二つの技術です。JoeSirajbubbleKevadの投稿に追加したいと思います。

ラヴェル:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

フラット化:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()これは、配列のコピーを作成しないライブラリレベルの関数であるため、より高速です。ただし、を使用している場合、配列Aの変更は元の配列Mに引き継がれますnumpy.ravel()

numpy.flatten()より遅いですnumpy.ravel()。しかし、numpy.flatten()Aの作成に使用している場合、Aの変更は元の配列Mに引き継がれません

numpy.squeeze()そしてM.reshape(-1)より遅いnumpy.flatten()numpy.ravel()

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.