Python 在所有3维中切片三维阵列的问题

Python 在所有3维中切片三维阵列的问题,python,3d,slice,Python,3d,Slice,我对3d numpy阵列的切片有问题。 我有一个3d数据数组(zcdata),用于物理网格系统的角点深度,由于所有角点重复,其大小是实际网格大小的两倍(相邻网格共享角点,但在数据集中重复)。假设网格在X、Y和Z方向上有Nx、Ny、Nz单元;我的角数据的大小为2*Nx、2*Ny、2*Nz 这些数据作为一个长的1D数组从一个巨大的ASCII文件中读取,然后用下面的代码重新塑造成正确的3d格式。在我的例子中,Nx,Ny,Nz=(22923345),因此zcdata(角数据数组)的维数(458*466*

我对3d numpy阵列的切片有问题。 我有一个3d数据数组(
zcdata
),用于物理网格系统的角点深度,由于所有角点重复,其大小是实际网格大小的两倍(相邻网格共享角点,但在数据集中重复)。假设网格在X、Y和Z方向上有
Nx、Ny、Nz
单元;我的角数据的大小为
2*Nx、2*Ny、2*Nz

这些数据作为一个长的1D数组从一个巨大的ASCII文件中读取,然后用下面的代码重新塑造成正确的3d格式。在我的例子中,
Nx,Ny,Nz=(22923345)
,因此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) 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[:,:,kk]
zcorn_data_1N = zcorn_data_1N[:,jj,:]
zcorn_data_1N = zcorn_data_1N[ii,:,:]

我想知道我是否遗漏了任何一点

您的索引数组需要是相同的形状,或者是相同的形状。因此,您应该调整它们的大小(提升它们的维度),以便它们的非单例维度不被共享,并且它们将是可广播的

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]
zcorn_data_1N = zcorn_data[:,:,kk]
zcorn_data_1N = zcorn_data_1N[:,jj,:]
zcorn_data_1N = zcorn_data_1N[ii,:,:]
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]