python,使用存储在另一个图像中的索引对 ndimage 的维度子集

python, dimension subset of ndimage using indices stored in another image

我有两张图片,尺寸如下,x、y、z:

img_a: 50, 50, 100

img_b: 50, 50

我想将 img_a 的 z-dim 从 100 减少到 1,只抓取与 img_b 中存储的索引一致的值,逐个像素,因为索引在整个过程中都不同图片。

这应该会生成第三张图片,尺寸为:

img_c: 50, 50

是否已经有处理这个问题的函数?

谢谢, 彼得

好的,用矢量化方法更新了。

Here 是一个重复的问题,但当行和列的维度大小不同时,该解决方案目前不起作用。

下面的代码包含我添加的方法,该方法使用 numpy.indices() 显式创建用于查找目的的索引,然后以矢量化方式执行循环逻辑。它比 numpy.meshgrid() 方法稍慢 (2x),但我认为它更容易理解,并且它也适用于不相等的行和列大小。

时间是大概的,但在我的系统上我得到:

Meshgrid time: 0.319000005722
Indices time: 0.704999923706
Loops time: 13.3789999485

-

import numpy as np
import time


x_dim = 5000
y_dim = 5000
channels = 3

# base data
a = np.random.randint(1, 1000, (x_dim, y_dim, channels))
b = np.random.randint(0, channels, (x_dim, y_dim))


# meshgrid method (from here  )
start_time = time.time()
i1, i0 = np.meshgrid(xrange(x_dim), xrange(y_dim), sparse=True)
c_by_meshgrid = a[i0, i1, b]
print('Meshgrid time: {}'.format(time.time() - start_time))

# indices method (this is the vectorized method that does what you want)
start_time = time.time()
b_indices = np.indices(b.shape)
c_by_indices = a[b_indices[0], b_indices[1], b[b_indices[0], b_indices[1]]]
print('Indices time: {}'.format(time.time() - start_time))

# loops method
start_time = time.time()
c_by_loops = np.zeros((x_dim, y_dim), np.intp)
for i in xrange(x_dim):
    for j in xrange(y_dim):
        c_by_loops[i, j] = a[i, j, b[i, j]]
print('Loops time: {}'.format(time.time() - start_time))


# confirm correctness
print('Meshgrid method matches loops: {}'.format(np.all(c_by_meshgrid == c_by_loops)))
print('Loop method matches loops: {}'.format(np.all(c_by_indices == c_by_loops)))