Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在3D数组中裁剪3D数组的最快方法_Python_Arrays_Numpy - Fatal编程技术网

使用Python在3D数组中裁剪3D数组的最快方法

使用Python在3D数组中裁剪3D数组的最快方法,python,arrays,numpy,Python,Arrays,Numpy,我有一个3D数组和一个3D索引列表。我的目标是分离出一个特定的大小(3x3x3或5x5x5或其它)的小3D体积,用于每个索引(索引位于体积的中间)。 目前,我这样做: 1)第五组2D阵列(中间有兴趣的数组,跟随索引)。所以有一个5xNxN阵列。 2) 对于5x5x5卷,对于5xNxN数组中的每个2D数组(0,N,N;1,N,N..等),我将围绕相同索引裁剪一个5x5数组。 3) 堆叠这五个5x5 2D阵列以获得我的小3D体积 有没有最快的方法来完成这项工作 这里有一个解释代码: arr = np

我有一个3D数组和一个3D索引列表。我的目标是分离出一个特定的大小(3x3x3或5x5x5或其它)的小3D体积,用于每个索引(索引位于体积的中间)。 目前,我这样做: 1)第五组2D阵列(中间有兴趣的数组,跟随索引)。所以有一个5xNxN阵列。 2) 对于5x5x5卷,对于5xNxN数组中的每个2D数组(0,N,N;1,N,N..等),我将围绕相同索引裁剪一个5x5数组。 3) 堆叠这五个5x5 2D阵列以获得我的小3D体积

有没有最快的方法来完成这项工作

这里有一个解释代码:

arr = np.zeros((7,7,7)) #Just a 3D array
ind = [3, 3, 3] #My index
for el in range(arr.shape[0]):
    if el==ind[0]:
        group = arr[el-2:el+3] #it isolates a 3D volume with arr[ind[0]] in the middle
        volume_3d = []
        for i in group:
            volume_2d = i[ind[1]-2:ind[1]+3, ind[2]-2:ind[2]+3]
            volume_3d.append (volume_2d) #it builds the 3D volume

谢谢

Numpy非常容易地支持这样的切片:

dim = 5
x = dim // 2
i,j,k = ind

volume_3d = arr[i-x:i+(dim-x), j-x:j+(dim-x), k-x:k+(dim-x)].copy()


你的外环似乎没用。您可以从
el=ind[0]
开始执行
中的所有内容,如果
# Your implementation.
dim = 5
x = dim // 2
arr = np.random.randn(7, 7, 7)
el = ind[0]
group = arr[el-x:el+(dim-x)] 
volume_3d = []
for i in group:
    volume_2d = i[ind[1]-x:ind[1]+(dim-x), ind[2]-x:ind[2]+(dim-x)]
    volume_3d.append (volume_2d)

# Proposed in this post.
i,j,k = ind
volume_3d_2 = arr[i-x:i+(dim-x), j-x:j+(dim-x), k-x:k+(dim-x)]

print(np.array_equal(volume_3d, volume_3d_2))
True