我有一个关于3d numpy数组切片的问题。
我有一个三维数据阵列(zcdata
)用于物理网格系统的角点深度,其大小是实际网格大小的两倍,因为所有角落重复(相邻网格共享角点但在数据中重复)组)。假设网格在X,Y和Z方向上有Nx,Ny,Nz
个单元格;我的角数据的大小为2*Nx, 2*Ny, 2*Nz
此数据从巨大的ASCII文件中读取为长1D数组,然后使用以下代码重新整形为适当的3d格式。在我的情况下Nx, Ny, Nz = (229, 233, 45)
,因此(458 * 466 * 90)
的zcdata(角数据数组)维度维度有点大。
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个角落示例○ - ○ - ○ - ○) 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,:,:]
我想知道我在这里是否遗漏了任何一点!
答案 0 :(得分:0)
您的索引数组需要具有相同的形状或broadcastable为相同的形状。因此,您应该调整它们的大小(提升它们的维度),使其非单一维度不被共享,并且它们将是可广播的。
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]