为了账号安全,请及时绑定邮箱和手机立即绑定

在任意轴上迭代体积的更 Pythonic 方式?

在任意轴上迭代体积的更 Pythonic 方式?

繁星淼淼 2022-06-07 16:31:22
我有一个函数,它接受一个 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)
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

只需使用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)


查看完整回答
反对 回复 2022-06-07
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我猜你想要的是 [numpy.split()]:( https://docs.scipy.org/doc/numpy/reference/generated/numpy.split.html )


axis = 0 # Can be set to 0, 1, or 2 

volume = np.ones((100, 100, 100))

n_slices = volume.shape[axis]


slices = np.split(volume, n_slices, axis)


查看完整回答
反对 回复 2022-06-07
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你可以使用

my_slice = volume[tuple(i if n == axis else slice(100) for n in range(3))]

以便

slices = [volume[tuple(i if n == axis else slice(100) for n in range(3))] for i in range(100)]



查看完整回答
反对 回复 2022-06-07
  • 3 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信