2

バックグラウンド: 私が使用しているデータは、netCDF4オブジェクトから抽出されています。これにより、初期化時にnumpyのマスクされた配列が作成されますが、numpyreshape()メソッドをサポートしていないようで、すべてのデータがコピーされた後にのみ再形成できます=方法もスロー。

質問:基本的に平坦化された 2 次元配列である 1 次元配列を、再形成せずにサブサンプリングするにはどうすればよいですか?

import numpy

a1 = np.array([[1,2,3,4],
               [11,22,33,44],
               [111,222,333,444],
               [1111,2222,3333,4444],
               [11111,22222,33333,44444]])

a2 = np.ravel(a1)

rows, cols = a1.shape

row1 = 1
row2 = 3

col1 = 1
col2 = 3

1 次元配列を 2 次元配列に再形成する必要のない高速スライス方法を使用したいと考えています。

望ましい出力:

np.ravel(a1[row1:row2, col1:col2])

>> array([ 22,  33, 222, 333])

開始位置と終了位置を取得するところまで行きましたが、これはこれらのポイントの間のすべてのデータ (つまり、余分な列) を選択するだけです。

idx_start = (row1 * cols) + col1
idx_end   = (row2 * cols) + col2

更新:ハイメの素晴らしい答え を試しましたがnetCDF4、2-D インデックスは許可されないようです。

z = dataset.variables["z"][idx]
  File "netCDF4.pyx", line 2613, in netCDF4.Variable.__getitem__ (netCDF4.c:29583)
  File "/usr/local/lib/python2.7/dist-packages/netCDF4_utils.py", line 141, in _StartCountStride
    raise IndexError("Index cannot be multidimensional.")
IndexError: Index cannot be multidimensional.
4

3 に答える 3