2017-01-01 4 views
1

私はいくつかのより高い次元のnumpy配列をインポートできると思われるプログラムを書いています。アレイのようなものa:numpy配列でどの次元をインデックス化するかを選択する

さらに、各ディメンションは物理的な次元に対応します。周波数、距離、...これらの次元に関する情報を持つ配列をインポートします。上記の場合:

freq = [1,2,3] 
time = [0,1,2,3,4,5,6] 
distance = [0,0,0,4,1] 
angle = [0,180] 
この例から明らか

と署名はFREQのように2との寸法0、時間ディメンションに属していることを把握することができます。これは事前に知られていないので、私は周波数がインデックス化された寸法が分からないので、しかし、私は

a_f1 = a[1,:,:,:] 

のような周波数スライスを取ることができます。

したがって、インデックスを使用してインデックスするディメンションを選択する方法があります。

これは、ディメンション0のスライスとそれ以外のすべてのディメンションを返します。

a_p = a[0, 1:, ::2, :-1] 

を行う

は、あなたはかなり簡単に、必要な場所sliceオブジェクトを使用して、インデックスのタプルを構築して、あなたの配列のインデックスにこれを使用することができ

a_p = a.get_slice([0, 1, 2, 3], [[0,], [1,2,3,4], [0,2,4,6], [0,]]) 
+0

は、あなたがそこにあるかを事前にどのように多くの寸法を知っているあなたと仮定します - ?ドキュメント遅くを読んでいる間、私はnumpyのは、何をしたいんインデックス・ルーチンを持って気づきましたかつまり、あなたの 'a.get_slice([0、]、[[1]、])'に対して、正確に3つの "完全な他の次元"があるはずですか? – BrenBarn

+0

@BrenBarnまあ、おそらくその構文です。私は構文が必要なものを示すようにしました。 – Robert

+0

パンダ[階層索引(MultiIndex)](http://pandas.pydata.org/pandas-docs/stable/advanced.html)に関するこの記事は興味深いと思います。 –

答えて

1

のようなものに対応するであろう。基本的にはレシピがこれです:私はそれが簡単にどのインデクサで行くどの次元を参照することができますだと思うので、ここで

indices = { 
    0: # put here whatever you want to get on dimension 0, 
    1: # put here whatever you want to get on dimension 1, 
    # leave out whatever dimensions you want to get all of 
} 
ix = [indices.get(dim, slice(None)) for dim in range(arr.ndim)] 
arr[ix] 

私は辞書でそれを行っています。あなたの例のデータを持つので

x = np.zeros([3,5,7,2]) 

私たちは、この操作を行います。

indices = {0: 1} 
ix = [indices.get(dim, slice(None)) for dim in range(x.ndim)] 

>>> x[ix].shape 
(5L, 7L, 2L) 

をお使いの配列がすべてゼロであるので、私はちょうどそれがあることを示すために、結果の形状を示しますよ私たちが欲しいもの。 (それはすべてゼロではなかったとしても、それはテキスト形式で3Dの配列を読み取ることは困難です。)

あなたの第二の例の場合:

indices = { 
    0: 0, 
    1: slice(1, None), 
    2: slice(None, None, 2), 
    3: slice(None, -1) 
} 
ix = [indices.get(dim, slice(None)) for dim in range(x.ndim)] 

>>> x[ix].shape 
(4L, 4L, 1L) 

あなたは形状が値の数に対応していることがわかりますあなたのa_pの例です注目すべき点の1つは、そのインデックスに1つの値しか指定していないため、最初のディメンションがなくなったことです。最後のディメンションは存在しますが、長さが1の場合は、1つの要素だけを取得するスライスを指定したためです。 (これはsome_list[0]があなたに単一の値を与えるのと同じ理由ですが、は1要素のリストを与えます)。

0

これを達成するにはadvanced indexingを使用できます。

インデックスが配列全体に正しくブロードキャストされるように、各ディメンションのインデックスを適切に整形する必要があります。たとえば、3-d配列の最初の次元のインデックスは、(x, 1, 1)という形にする必要があります。これにより、最初の次元にブロードキャストされます。 3次元配列の第2次元のインデックスは、第2次元にわたってブロードキャストするように、形状が(1, y, 1)である必要があります。入力としてaについて

import numpy as np 
a = np.zeros([3,5,7,2]) 
b = a[0, 1:, ::2, :-1] 

indices = [[0,], [1,2,3,4], [0,2,4,6], [0,]] 
def get_aslice(a, indices): 
    n_dim_ = len(indices) 
    index_array = [np.array(thing) for thing in indices] 
    idx = [] 
    # reshape the arrays by adding single-dimensional entries 
    # based on the position in the index array 
    for d, thing in enumerate(index_array): 
     shape = [1] * n_dim_ 
     shape[d] = thing.shape[0] 
     #print(d, shape) 
     idx.append(thing.reshape(shape)) 

    c = a[idx] 

    # to remove leading single-dimensional entries from the shape 
    #while c.shape[0] == 1: 
    # c = np.squeeze(c, 0) 

    # To remove all single-dimensional entries from the shape 
    #c = np.squeeze(c).shape 

    return c 

、それは(1,4,4,1)あなたa_p例では、(4,4,1)の形状を有している形状の配列を返します。余分なディメンションを削除する必要がある場合は、関数のnp.squeeze行のコメントを解除します。


今私は愚かな気分になります。 numpy.ix_

>>> a = numpy.zeros([3,5,7,2]) 
>>> indices = [[0,], [1,2,3,4], [0,2,4,6], [0,]] 
>>> index_arrays = np.ix_(*indices) 
>>> a_p = a[index_arrays] 
>>> a_p.shape 
(1, 4, 4, 1) 
>>> a_p = np.squeeze(a_p) 
>>> a_p.shape 
(4, 4) 
>>> 
+0

あなたが '索引 'に表示するものは、* result *として望むものですが、それを指定する必要はありません。彼は「次元0に指標1が欲しい」だけを指定し、あなたの「指標」を自動的に作成したいと考えています。 – BrenBarn

+0

@brenbarn、それから私は全くそれを誤解しました。 – wwii

+0

おっと、実際に私はそれを誤解していると思います。彼の例はあなたのことを示しています。しかし、実際のインデックスではなく、スライスを指定することと平行であるため、例として少し奇妙です。 '.ix_'はスライスに対応していますか?また、すべてのディメンションにインデックスを指定したくない場合は機能しますか? – BrenBarn

関連する問題