2017-03-15 15 views

答えて

11
b = a[(slice(None),) * k + (i,)] 

を手動でインデックスタプルを構築するよりも、よりよい何かがあるに違いありません。 Python language referenceに記載されるように

、フォーム

a[:, :, :, :, :, i] 

の発現は、我々は、そのタプルを構築する代わりに、直接のスライス表記を使用して、同じ効果を達成することができる

a[(slice(None), slice(None), slice(None), slice(None), slice(None), i)] 

に変換されます。 (タプルを構築することは、直接a[(i,)]代わりにk=0ためa[i]を生成するが、numpyのは、スカラーiに同じこれらを処理するマイナーな警告があります。)

+0

Whoaw。私は喜んでこれをコピー&ペーストしますが、ドキュメンテーションへのリンクはおそらくまだ役に立つでしょう。スライス表記法、例えば、 –

+0

。 'a []'はタプル(この場合は ':'スライスオブジェクトの構文sugerである ':'表記)のタプルを渡す '__getitem__'の呼び出しの文法的な砂糖です –

+0

'b [np.index_exp [:] * k + np.index_exp [i]]'という綴りもあります。これはおそらく少し読みやすくなります。 – Eric

3

私はそれがk個の薄暗いのために働くかどうかわからないが、それは2薄暗いに対して行います

a.take(i,axis=k) 
+2

これはビューの代わりにコピーを作成するという欠点があります。 – user2357112

+0

@ user2357112:ああ、ちょっと驚きだよ。 – Eric

1

基本的に、あなたはプログラムでaの指標としてそれを渡すためにタプル:, :, :, :, :, i, ...を作成できるようにしたいです。残念ながら、コロン演算子で直接通常のタプル乗算を使用することはできません(つまり、(:,) * kはコロン演算子kのタプルを生成できません)。ただし、colon = slice(None)を使用すると、「コロンスライス」のインスタンスを取得できます。その後、b = a[(colon,) * k + (i,)]を実行すると、k次元のi番目の列に効果的にインデックスするaとなります。このアプローチは、アレイ*の全体のコピーを作成するかどう

def nDimSlice(a, k, i): 
    colon = slice(None) 
    return a[(colon,) * k + (i,)] 
+2

「i」の後の余分なスライスは、numpyが問題になるまでは不要です。 – Aaron

+0

@Aaronありがとう、私は気付いていませんでした! – user108471

0

私はわからないんだけど、私は転置のスライスを取る:

機能でこれをラッピング、あなたが取得したいですマトリックス:k番目の軸を得るために:

これはまた、スライスを試す前に次元の数をチェックするという追加のボーナスを追加しました。

* docsによれば、可能であればいつでもメモリビューが作成されます。ここで

1

は、予めそのオペランドの形状を知らなくても、負の軸の引数を扱うことができる遅いエントリである:

def put_at(inds, axis=-1, slc=(slice(None),)): 
    return (axis<0)*(Ellipsis,) + axis*slc + (inds,) + (-1-axis)*slc 

a[put_at(ind_list,axis=axis)] 

ind_listのように使用されるスカラーであることができますあなたの場合やもっと興味深いもののように。

this私のコメント。

関連する問題