2015-09-24 16 views
7

2次元配列から行/列をスライスし、(col_size x 1)または(1 x row_size)の配列を得るためのすっきりした小さなトリックを見つけようとしています。Numpy - 配列から2次元の行または列ベクトルをスライスする

スライシングごとにnumpy.reshape()を使用するより簡単な方法はありますか?

乾杯、 ステファン

+0

予想される入力と出力の例を教えてください。 1Dアレイまたは2Dアレイを取得しますか? –

+0

たとえば、 'np.ones((2,40))'のような配列を持っているとしましょう。この配列から、 'np.array((1,40))'の形で行全体をスライスしたいと思います。結果は2次元配列でなければなりません – neurotronix

+1

np.newaxisまたはNoneを使用して新しい軸を挿入 –

答えて

11

あなたはスライスし、1回の操作で新しい軸を挿入することができます。例えば、ここで2次元配列の:

>>> a = np.arange(1, 7).reshape(2, 3) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6]]) 

単一カラム(形状(2, 1)の配列を返す)と、第3の次元としてNoneとスライスアウトスライスに:アウトスライスに

>>> a[:, 1, None] 
array([[2], 
     [5]]) 

を単一(形状(1, 3)の配列を返す)、第二の次元としてNoneとスライス:

>>> a[0, None, :] 
array([[1, 2, 3]]) 
+0

多くの感謝!私が必要としたものを正しく!ナンシーは本当に素晴らしく、速く、少なくとも私にとっては、すべて直感的ではありません。 – neurotronix

+1

問題ありません!インデックス作成/再整形には頭を包み込むためにしばらく時間がかかりますが(少なくとも私の場合はそうでしたが)、少しの練習の後には意味があります。 [docs](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)は、ここで何が起こっているのかを説明するのに非常に適しています(*基本スライス*セクション)。 –

+0

奇妙なことに、インデックス付けと「なし」追加を組み合わせることは決して考えませんでした。私はそれが既存の配列の次元を拡張するために 'None'を使うことはちょうど習慣の力であると思います。そしてそれはより速いです。 – hpaulj

6

指数スライス、リストや配列

X[[0],:] 
    X[0:1,4] 

を行います。しかし、それはタイピングを必要とするという事実以外のreshapeには何の問題もありません。遅くはない。 [None,:]はそれのための素敵な短い手です。リストインデックスの

使用は最短かもしれないが、それは(プラスまたはマイナスの?)コピーを生成しないと(100,100)整数配列の場合

遅い:

In [487]: timeit x[[50],:] 
100000 loops, best of 3: 10.3 µs per loop # slowest 

In [488]: timeit x[50:51,:] 
100000 loops, best of 3: 2.24 µs per loop # slice indexing is fast 

In [489]: timeit x[50,:].reshape(1,-1) 
100000 loops, best of 3: 3.29 µs per loop # minimal time penalty 

In [490]: timeit x[50,:][None,:] 
100000 loops, best of 3: 3.55 µs per loop 

In [543]: timeit x[None,50,:]   # **best** 
1000000 loops, best of 3: 1.76 µs per loop 

コピーするための一つのテストデータバッファポインタを元のデータと比較することです。

In [492]: x.__array_interface__['data'] 
Out[492]: (175920456, False) 
In [493]: x[50,:].__array_interface__['data'] 
Out[493]: (175940456, False) 
In [494]: x[[50],:].__array_interface__['data'] 
Out[494]: (175871672, False) # different pointer 
In [495]: x[50:51,:].__array_interface__['data'] 
Out[495]: (175940456, False) 
In [496]: x[50,:][None,:].__array_interface__['data'] 
Out[496]: (175940456, False) 
+0

ありがとうございます。 – neurotronix

+0

問題は、スケーラブルなニューラルネットワークを実装しており、レイヤーサイズの観点からスケーラブルです。 'reshape'では非常に多くのインスタンス属性(例えばレイヤーサイズ)にアクセスする必要がありました。最後にそれを正しく取得するには: 'a [0、None、:]'を使って 'array' aから行をスライスすると、コピーを返しますか? – neurotronix

+1

'[0、None、:]'はビューを返します。 – hpaulj

1

この方法はいかがですか?

In [73]: arr = (np.arange(5, 25)).reshape(5, 4) 

In [74]: arr 
Out[74]: 
array([[ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16], 
     [17, 18, 19, 20], 
     [21, 22, 23, 24]]) 

# extract column 1 as a column vector 
In [79]: col1 = arr[:, [0]] 
In [80]: col1.shape 
Out[80]: (5, 1) 

In [81]: col1 
Out[81]: 
array([[ 5], 
     [ 9], 
     [13], 
     [17], 
     [21]]) 


# extract row 1 as a row vector 
In [82]: row1 = arr[[0], :] 

In [83]: row1.shape 
Out[83]: (1, 4) 

In [84]: row1 
Out[84]: array([[5, 6, 7, 8]]) 
+0

清潔で詳細な回答ありがとう!しかし、質問が2歳以上であることに気付かなかったのですか?乾杯:) – neurotronix

+0

@neurotronix私はそれを実現しました。とにかく、教育的な理由から、時間は決して重要ではありません;) – kmario23

+0

本当に、答えを出す時間を取ってくれてありがとう! – neurotronix

関連する問題