2次元配列から行/列をスライスし、(col_size x 1)
または(1 x row_size)
の配列を得るためのすっきりした小さなトリックを見つけようとしています。Numpy - 配列から2次元の行または列ベクトルをスライスする
スライシングごとにnumpy.reshape()
を使用するより簡単な方法はありますか?
乾杯、 ステファン
2次元配列から行/列をスライスし、(col_size x 1)
または(1 x row_size)
の配列を得るためのすっきりした小さなトリックを見つけようとしています。Numpy - 配列から2次元の行または列ベクトルをスライスする
スライシングごとにnumpy.reshape()
を使用するより簡単な方法はありますか?
乾杯、 ステファン
あなたはスライスし、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]])
多くの感謝!私が必要としたものを正しく!ナンシーは本当に素晴らしく、速く、少なくとも私にとっては、すべて直感的ではありません。 – neurotronix
問題ありません!インデックス作成/再整形には頭を包み込むためにしばらく時間がかかりますが(少なくとも私の場合はそうでしたが)、少しの練習の後には意味があります。 [docs](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)は、ここで何が起こっているのかを説明するのに非常に適しています(*基本スライス*セクション)。 –
奇妙なことに、インデックス付けと「なし」追加を組み合わせることは決して考えませんでした。私はそれが既存の配列の次元を拡張するために 'None'を使うことはちょうど習慣の力であると思います。そしてそれはより速いです。 – hpaulj
指数スライス、リストや配列
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)
ありがとうございます。 – neurotronix
問題は、スケーラブルなニューラルネットワークを実装しており、レイヤーサイズの観点からスケーラブルです。 'reshape'では非常に多くのインスタンス属性(例えばレイヤーサイズ)にアクセスする必要がありました。最後にそれを正しく取得するには: 'a [0、None、:]'を使って 'array' aから行をスライスすると、コピーを返しますか? – neurotronix
'[0、None、:]'はビューを返します。 – hpaulj
この方法はいかがですか?
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]])
清潔で詳細な回答ありがとう!しかし、質問が2歳以上であることに気付かなかったのですか?乾杯:) – neurotronix
@neurotronix私はそれを実現しました。とにかく、教育的な理由から、時間は決して重要ではありません;) – kmario23
本当に、答えを出す時間を取ってくれてありがとう! – neurotronix
予想される入力と出力の例を教えてください。 1Dアレイまたは2Dアレイを取得しますか? –
たとえば、 'np.ones((2,40))'のような配列を持っているとしましょう。この配列から、 'np.array((1,40))'の形で行全体をスライスしたいと思います。結果は2次元配列でなければなりません – neurotronix
np.newaxisまたはNoneを使用して新しい軸を挿入 –