首页 > 解决方案 > 重塑numpy数组

问题描述

我要做的是获取一个表示 3D 图像数据的 numpy 数组并计算每个体素的粗麻布矩阵。我的输入是一个形状矩阵 (Z,X,Y),我可以轻松地沿 z 进行切片并检索单个原始图像。

gx, gy, gz = np.gradient(imgs)

gxx, gxy, gxz = np.gradient(gx)
gyx, gyy, gyz = np.gradient(gy)
gzx, gzy, gzz = np.gradient(gz)

我可以按如下方式访问单个体素的粗麻布:

x = 100
y = 100
z = 63

H = [[gxx[z][x][y], gxy[z][x][y], gxz[z][x][y]],
     [gyx[z][x][y], gyy[z][x][y], gyz[z][x][y]],
     [gzx[z][x][y], gzy[z][x][y], gzz[z][x][y]]]

但这很麻烦,我不能轻易地对数据进行切片。

我尝试使用 reshape 如下

H = H.reshape(Z, X, Y, 3, 3) 

但是当我通过检索特定体素的粗麻布来测试这一点时,从重新整形的数组返回的值与原始数组完全不同。

我想我可以以某种方式使用 zip 但我只能找到用于制作元组列表的方法。

标签: pythonnumpyimage-processinghessian-matrix

解决方案


我们可以使用列表推导来获取粗麻布 -

H_all = np.array([np.gradient(i) for i in np.gradient(imgs)]).transpose(2,3,4,0,1)

只是给它一点解释:循环调用[np.gradient(i) for i in np.gradient(imgs)]的两个级别的输出,在外部两个轴上产生一个成形的张量。我们需要这两个作为最终输出中的最后两个轴。所以,我们用转置推到最后。np.gradient(3 x 3)

因此,H_all拥有所有的粗麻布,因此我们可以提取我们特定的粗麻布给定x,y,z,就像这样 -

x = 100
y = 100
z = 63
H = H_all[z,y,x]

推荐阅读