我有一個函數,它接受一個 3D numpy 數組(我們將其稱為卷),并將其轉換為 2D 切片列表。我希望用戶能夠指定對其進行切片的軸。我用下面的代碼管理這個,但是三重 if 語句似乎不是最優(yōu)雅的方法。我會感謝人們對是否可以以更好的方式實現這一點的想法。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)

斯蒂芬大帝
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)

慕無忌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)]
添加回答
舉報
0/150
提交
取消