python - 如何向量化多维 numpy 数组中的提取

标签 python numpy multidimensional-array vectorization extract

我正在努力解决矢量化问题,乍一看似乎很简单:

假设我有 100 张大小为 (7, 7) 的图像,其中 2 个 channel 由 numpy 表示大小为 (100, 2, 7, 7) 的数组。我想在所有图像上提取小补丁(比如说大小(2,3,3)),但这些补丁并不位于每个图像上的同一位置。补丁的位置由大小为 (2, 100) 的矩阵描述(每个图像一个 x 和一个 y)。 我可以通过对所有图像进行 for 循环来做到这一点,但这需要时间。

这里是一个示例代码:

data = np.arange(9800).reshape((100, 2, 7, 7))
size = 3
pos = np.random.randint(0, 7-size, (2, 100))
for i in range(a.shape[0]):
    patch = data[i, :, pos[0,i]:(pos[0,i]+size), pos[1,i]:pos[1,i]+size] 

换句话说,我想在没有 for 循环的情况下重现这段代码。 有人知道这样做吗?

最佳答案

numpy.lib.stride_tricks.as_strided 的标准技巧应该在这里工作:

das = np.lib.stride_tricks.as_strided(data, (5, 5, 100, 2, 3, 3), data.strides[-2:] + data.strides)
patches = das[(*pos, np.arange(100))]

您可以使用以下方法验证其是否有效:

for i in range(data.shape[0]):
    assert np.all(patches[i]==data[i,:,pos[0,i]:pos[0,i]+size,pos[1,i]:pos[1,i]+size])

关于python - 如何向量化多维 numpy 数组中的提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48620923/

相关文章:

python - 生成拉丁方的有效方法(或在两个轴上唯一地随机排列矩阵中的数字 - 使用 NumPy)

c++ - 访问二维数组 (T[N][M]) 作为大小为 N*M 的一维数组是否保证有效?

java - 如何读取文本文件并使用 JOptionPane 显示它。 (二维数组)

python - 在 Python 中从 XML 数据创建字典(使用 xml.etree.ElementTree)

python - 如何将两个 for 循环合并到列表理解中

python - 在 Python 中对嵌套字典进行排序

python - 在 osx 上使用 numpy 的 lapack_lite 进行多处理的段错误,而不是 linux

python - 记住Python方法中的单个参数

php - 在PHP中递归创建多维数组

python - 带有自定义图层的 Scapy sr()