1

我对 3d numpy 数组的切片有疑问。我有一个 3d 数据数组zcdata(假设网格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])

我有兴趣仅提取唯一的角点,即每个方向上的每隔一个索引加上最后一个角(因此对于 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

而下面的一对一切片效果很好:

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 回答