n
次元のnumpy配列があり、k
次元のi
番目のスライスを取得したいと考えています。numpyの配列でk番目の次元のi番目のスライスを取得する
# ...
elif k == 5:
b = a[:, :, :, :, :, i, ...]
# ...
n
次元のnumpy配列があり、k
次元のi
番目のスライスを取得したいと考えています。numpyの配列でk番目の次元のi番目のスライスを取得する
# ...
elif k == 5:
b = a[:, :, :, :, :, i, ...]
# ...
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
に同じこれらを処理するマイナーな警告があります。)
私はそれがk個の薄暗いのために働くかどうかわからないが、それは2薄暗いに対して行います
a.take(i,axis=k)
これはビューの代わりにコピーを作成するという欠点があります。 – user2357112
@ user2357112:ああ、ちょっと驚きだよ。 – Eric
基本的に、あなたはプログラムで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,)]
「i」の後の余分なスライスは、numpyが問題になるまでは不要です。 – Aaron
@Aaronありがとう、私は気付いていませんでした! – user108471
私はわからないんだけど、私は転置のスライスを取る:
機能でこれをラッピング、あなたが取得したいですマトリックス:k番目の軸を得るために:
これはまた、スライスを試す前に次元の数をチェックするという追加のボーナスを追加しました。
* docsによれば、可能であればいつでもメモリビューが作成されます。ここで
は、予めそのオペランドの形状を知らなくても、負の軸の引数を扱うことができる遅いエントリである:
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私のコメント。
Whoaw。私は喜んでこれをコピー&ペーストしますが、ドキュメンテーションへのリンクはおそらくまだ役に立つでしょう。スライス表記法、例えば、 –
。 'a []'はタプル(この場合は ':'スライスオブジェクトの構文sugerである ':'表記)のタプルを渡す '__getitem__'の呼び出しの文法的な砂糖です –
'b [np.index_exp [:] * k + np.index_exp [i]]'という綴りもあります。これはおそらく少し読みやすくなります。 – Eric