バックグラウンド:
私が使用しているデータは、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.