python - 重塑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 但我只能找到用于制作元组列表的方法。
- 奖励:如果有更快的方法来完成这个,请告诉我,我基本上需要为 3D 数据集中的每个体素计算 hessian 矩阵的三个特征值。计算粗麻布值非常快,但找到单个 2D 图像切片的特征值大约需要 20 秒。是否有任何用于图像处理的 GPU 或张量流加速库?
解决方案
我们可以使用列表推导来获取粗麻布 -
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]
推荐阅读
- powershell - 使用 Powershell CSOM 的 Sharepoint Online 列表,无法提取列表数据
- python - 检查数据中是否有日期跳过
- c# - 选择保留在excel中的前一个单元格上
- c# - 如何检查属性[]是否已被使用
- java - 带有匿名内部类的 Java 比较器接口 NullsLast
- typescript - 以类型安全的方式迭代对象属性
- c# - 如何实现自定义授权asp.net core mvc
- java - 如何在 Android 中使用 MPAndroidChart 自定义饼图?
- javascript - NPM 知道脚本是否作为前/后脚本运行
- reactjs - IonSearchbar inputmode="search" 在 iPhone 上不起作用