3

私は配列を持っています、言ってみましょう:

A = np.array([1., 2.])

次のようにするだけで、新しい次元を追加できます。

def redim(arr):
   return arr[:, None]

ここで、この方法で追加のディメンションを動的に追加したいと思います。

def redim(arr, dims):
   return arr[dims]

だから私は次のようなことができます:

redim(A, [:, None])
redim(A, [None, :])
redim(A, [none, :, None])

これが可能かどうかは誰にもわかりますか?

動的に変更できるようにするには、どのような 2 番目の引数を指定する必要がありますか? (文字列、オブジェクト、リスト)? connect拡張された配列を取得するために両方の引数を取得するにはどうすればよいですか?

expand_dims ルートに進むことができることはわかっていますが、1 回のスワイプで展開されたすべてのディメンションを定義する方法があれば、私のコードはより明確になります。

前もって感謝します!

4

1 に答える 1

5

reshapeはあなたが探しているものだと思います。

超弦理論が私たちに教えてくれたことが1つあるとすれば、それはすべてのものが11次元を必要とするということです:

>>> A = np.array([1,2])
>>> A = A.reshape((2,1,1,1,1,1,1,1,1,1,1))
>>> A
array([[[[[[[[[[[1]]]]]]]]]],






   [[[[[[[[[[2]]]]]]]]]]])

これで、任意の次元に沿ってスライスを取得できます。

>>> A[1,:,:,:,:,0]
array([[[[[[[[[2]]]]]]]]])

reshape を使用する場合の唯一の要件は、要素の総数が変更されていないことです (つまり、最初の形状と 2 番目の形状の間で寸法の積が変更されていない必要があります)。

編集

とにかくスライスを使いたい場合は、次tupleのように引数の a を渡す必要があります。

def redim(a, dims):
    return a[dims]

>>> redim(A, (slice(None), None, slice(None), None))

Numpy 配列は、引数のタプルが渡されたときに特別な動作をします (これは、マルチインデックスA[1,2,:]がカバーの下で行うのとまったく同じです)。演算子への呼び出しをラップする場合は、実際には関数シグネチャ[]に準拠する必要があります。np.ndarray.__getitem__

多次元インデックスを取得するには、int のタプルNoneまたはsliceオブジェクト (スライス表記を使用するときに作成されるオブジェクト、たとえばA[1:2] <=> A.__getitem__(slice(1,2))) が必要です。操作は非常に面倒ですが、配列の numpy 規則に固執する場合は、すべての numpy 操作をラップできます (ここに要約されています) 。

于 2013-11-12T18:16:25.623 に答える