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

标签 python arrays numpy

我有一个 3D 数组和一个 3D 索引列表。我的目标是为每个索引(索引位于体积的中间)隔离特定大小(3x3x3 或 5x5x5 或其他)的小型 3D 体积。

目前,我这样做: 1) 将五个二维数组分组(中间有感兴趣的数组,在索引之后)。所以有一个 5xNxN 数组。 2) 对于 5x5x5 体积,对于我的 5xNxN 阵列的每个二维阵列(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()

# 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

关于python - 使用 Python 在 3D 数组中裁剪 3D 数组的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53235813/

相关文章:

python - 执行 python 脚本时更改进程名称

javascript - 如何在 JavaScript 中转换文档数组中的字典?

javascript - 逻辑: Make mechanism to parse a javascript array until each row has been taken under account

arrays - 缩短计算二维数组中唯一字符数量的函数

python - 移动数据帧的每个值而不更改列

python - 无法在 docker 化环境中从 Flask 连接到 Kafka

python - 如何让 easy_install.exe 不在单独的窗口中打开?

python - 索引 Dataframe 类似于具有 2d 索引的 numpy ndarray

python - 如何使该函数将数组数组作为输入使用 numba 进行编译?

python - 为什么 random.sample 比 numpy 的 random.choice 快?