在任意轴上遍历体积的更多pythonic方法?

时间:2019-09-25 19:35:03

标签: python arrays numpy volume nibabel

我有一个函数,该函数采用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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我想您想要的是[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)

答案 2 :(得分:1)

您可以使用

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)]