4

多次元変数を使用して、numpy 配列に読み込まれた netcdf ファイルのデータを操作しています。すべての次元 (numpy の軸) のすべての値をスキャンし、いくつかの値を変更する必要があります。しかし、与えられた変数の次元を事前に知りません。もちろん、実行時に、numpy 配列の ndims と形状を取得できます。次元数や形状を事前に知らなくても、すべての値を通るループをプログラムするにはどうすればよいですか? 変数が正確に 2 次元であることがわかっていれば、そうします

shp=myarray.shape
for i in range(shp[0]):
  for j in range(shp[1]):
    do_something(myarray[i][j])
4

4 に答える 4

3

numpy 配列のプロパティを使用できflatます。これは、すべての値 (形状に関係なく) に対してジェネレーターを返します。

例えば:

>>> A = np.array([[1,2,3],[4,5,6]])
>>> for x in A.flat:
...     print x
1
2
3
4
5
6

次のように、返される順序と同じ順序で値を設定することもできます。

>>> A.flat[:] = [x / 2 if x % 2 == 0 else x for x in A.flat]
>>> A
array([[1,  1,  3],
       [2,  5,  3]])

要素を返す順序がflat何らかの方法で保証されているかどうかはわかりません(要素がメモリ内にあるときに要素を反復処理するため、配列の規則によっては、本当にそうでない限り、常に同じになる可能性がありますわざとやっていますが、気をつけてください…)

そして、これはどの次元でも機能します。

** - 編集 - **

「順序が保証されていない」という意味を明確にするために、 によって返される要素の順序はflat変更されませんが、row1 = A.flat[:N]ほとんどの場合は機能しますが、 のようなものを当てにするのは賢明ではないと思います。

于 2013-10-30T18:31:19.577 に答える
3

ravelnditerおよびを調べる必要がありますndindex

# For the simple case
for value in np.nditer(a):
    do_something_with(value)

# This is similar to above
for value in a.ravel():
    do_something_with(value)

# Or if you need the index
for idx in np.ndindex(a.shape):
    a[idx] = do_something_with(a[idx])

無関係なメモとして、numpy 配列はa[i, j]の代わりにインデックス付けされますa[i][j]。Pythona[i, j]では、タプルを使用したインデックス作成と同等a[(i, j)]です。

于 2013-10-30T18:32:04.113 に答える
1

これは再帰で最も簡単かもしれません:

a = numpy.array(range(30)).reshape(5, 3, 2)

def recursive_do_something(array):
    if len(array.shape) == 1:
        for obj in array:
            do_something(obj)
    else:
        for subarray in array:
            recursive_do_something(subarray)

recursive_do_something(a)

インデックスが必要な場合:

a = numpy.array(range(30)).reshape(5, 3, 2)

def do_something(x, indices):
    print(indices, x)

def recursive_do_something(array, indices=None):
    indices = indices or []
    if len(array.shape) == 1:
        for obj in array:
            do_something(obj, indices)
    else:
        for i, subarray in enumerate(array):
            recursive_do_something(subarray, indices + [i])

recursive_do_something(a)
于 2013-10-30T18:20:44.507 に答える