1

3D numpy 配列のスライスに問題があります。zcdataすべてのコーナーが繰り返されるため、実際のグリッドのサイズの 2 倍のサイズを持つ物理グリッド システムのコーナー ポイントの深さの3D データ配列 ( ) があります (隣接するグリッドはコーナー ポイントを共有しますが、データ セットで繰り返されます)。Nx,Ny,Nzグリッドに X、Y、および Z 方向のセルがあると仮定します。私のコーナーデータのサイズは2*Nx, 2*Ny, 2*Nz

このデータは、巨大な ASCII ファイルから長い 1D 配列として読み取られ、次のコードで適切な 3D 形式に再形成されます。私の場合Nx, Ny, Nz = (229, 233, 45)、したがって zcdata の次元 (コーナー データ配列) の次元は(458 * 466 * 90)少し大きくなります。

zcdata is a (2*Nx * 2*Ny * 2*Nz) long array loaded from ASCII file as input:

zcorn_data = zcdata.reshape([2*Nz,2*Ny,2*Nx]).transpose([2,1,0])

各方向の他のすべてのインデックスに最後の 1 つのコーナーを加えた一意のコーナー ポイントのみを抽出することに関心があります (したがって、N セルの場合、N+1 コーナーを定義する必要があります: 簡単な計算: 3 つのセルと 4 つのコーナーの例 o--o --o--o) X、Y、Z の適切なインデックス スライスを以下に示します。

ii = np.append(range(0,2*Nx,2),-1)
jj = np.append(range(0,2*Ny,2),-1)
kk = np.append(range(0,2*Nz,2),-1)

ここで、3D 冗長コーナー データを一度にスライスしてみます (次のコード行を使用)。

zcorn_data_1N = zcorn_data[ii,jj,kk]

次のエラー メッセージで失敗します。


Traceback (most recent call last):
File "D:\ISI\Projects\09 Adco-Bab\5 Codes Cleaned\10 SRM Tools-Eclipse.py", line 755, in Read_Grid_CornPts

zcorn_data_1N = zcorn_data[np.append(range(0,2*Nx,2),-1),
  np.append(range(0,2*Ny,2),-1),np.append(range(0,2*Nz,2),-1)]

ValueError: shape mismatch: objects cannot be broadcast to a single shape

一方、次の 1 つずつスライスは完全に機能します。

zcorn_data_1N = zcorn_data[:,:,kk]
zcorn_data_1N = zcorn_data_1N[:,jj,:]
zcorn_data_1N = zcorn_data_1N[ii,:,:]

ここで何かポイントが欠けているのではないかと思っていました!

4

1 に答える 1

0

インデックス配列は、同じ形状であるか、同じ形状にブロードキャスト可能である必要があります。したがって、シングルトンでない次元が共有されず、ブロードキャスト可能になるようにサイズを変更する (次元を昇格させる) 必要があります。

ii = np.append(range(0,2*Nx,2),-1)
jj = np.append(range(0,2*Ny,2),-1)
kk = np.append(range(0,2*Nz,2),-1)

ii.resize((Nx+1,1,1))
jj.resize((1,Ny1,1))
kk.resize((1,1,Nz+1))

zcorn_data_1N = zcorn_data[ii,jj,kk]
于 2013-11-06T20:34:44.777 に答える