python - 在任意轴上迭代体积的更 Pythonic 方式?
问题描述
我有一个函数,它接受一个 3D numpy 数组(我们将其称为卷),并将其转换为 2D 切片列表。我希望用户能够指定对其进行切片的轴。我用下面的代码管理这个,但是三重 if 语句似乎不是最优雅的方法。我会感谢人们对是否可以以更好的方式实现这一点的想法。
axis = 0 # Can be set to 0, 1, or 2
volume = np.ones((100, 100, 100))
n_slices = volume.shape[axis]
slices = []
for i in range(n_slices):
if axis == 0:
my_slice = volume[i, :, :]
elif axis == 1:
my_slice = volume[:, i, :]
elif axis == 2:
my_slice = volume[:, :, i]
slices.append(my_slice)
解决方案
只需使用np.moveaxis
-
slices_ar = np.moveaxis(volume,axis,0)
最好的部分是它是一个输入视图,因此在运行时几乎是免费的。让我们验证view-part
-
In [83]: np.shares_memory(volume, np.moveaxis(volume,axis,0))
Out[83]: True
或者,使用np.rollaxis
它做同样的事情 -
np.rollaxis(volume,axis,0)
推荐阅读
- nhibernate - NHinernate - 将标准序列化为 json 并返回。用于 Web 界面使用
- bash - Bash:比较 2 个文件并用“层次结构”显示一个文件的唯一内容
- reactjs - 如何获取在主选项卡导航器中设置的默认 HeaderTitle?
- python - 更改一个字典会更改字典列表中的所有字典
- javascript - 在按钮单击时反应更新输入值
- java - 如何使用 java android app 为嵌入式应用程序生成 .h 文件
- delphi - 如何找出、何时、为什么以及如何在运行时更改组件的属性?
- r - 如何用第一行 RSHINY 替换列
- teradata - Teradata Express 重启后没有响应
- javascript - jspdf lib中fromhtml方法的问题