Python Numpy:如果索引为零,则用其他数组的索引替换索引

Python Numpy: Replacing index with index from other array if zero

我正在尝试合并一些使用 Intel 实感深度摄像头拍摄的深度数据帧。

深度数据帧采用以下格式:

dataframe1 = [[0, 0, 0, 0, 0, 10, 10, 10], [0, 0, 0, 0, 0, 10, 10, 10], [0, 0, 0, 0, 0, 10, 10, 10]]
dataframe2 = [[10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0]]

我想做的是做一些列表理解(ish)函数,如果索引为零,则将 dataframe2 的索引添加到 dataframe1。 预期输出如下所示:

dataframe1 = [[10, 10, 10, 0, 0, 10, 10, 10], [10, 10, 10, 0, 0, 10, 10, 10], [10, 10, 10, 0, 0, 10, 10, 10]]

我现在唯一的想法是像这样的 for 循环函数:

for idx, frame in enumerate(dataframe1):
    for idy, data in enumerate(frame):
        if data == 0:
            dataframe1[idx][idy] = dataframe2[idx][idy]

有没有更聪明的方法来使用 3D 数组进行列表推导?

我还尝试将数据帧附加到一个数组,然后使用以下方法获取平均值:

average values = numpy.average(all_arrays, axis=0).astype(uint16)

但是我的深度数据中的噪点会导致平均帧中出现很多额外的噪点。

感谢任何帮助。

此致 马丁

你可以用列表理解来做到这一点:

dataframe1 = [[0, 0, 0, 0, 0, 10, 10, 10], [0, 0, 0, 0, 0, 10, 10, 10], [0, 0, 0, 0, 0, 10, 10, 10]]
dataframe2 = [[10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0]]
[[m if not k else k for k, m in zip(i, j)] for i, j in zip(dataframe1, dataframe2)]

输出:

[[10, 10, 10, 0, 0, 10, 10, 10],
 [10, 10, 10, 0, 0, 10, 10, 10],
 [10, 10, 10, 0, 0, 10, 10, 10]]

编辑:请注意,如果 dataframe1 和 dataframe2 还不是 numpy 数组,这比使用 np.where() 更快(否则 np.where() 更快):

import timeit
d1 = [[0, 0, 0, 0, 0, 10, 10, 10], [0, 1, 0, 0, 0, 10, 10, 10], [0, 0, 0, 0, 0, 10, 10, 10]]*100000
d2 = [[10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0], [10, 10, 10, 0, 0, 0, 0, 0]]*100000

def lstcomp(dataframe1, dataframe2):
    return [[m if not k else k for k, m in zip(i, j)] for i, j in zip(dataframe1, dataframe2)]

def where(dataframe1, dataframe2):
    dataframe1 = np.array(dataframe1)
    dataframe2 = np.array(dataframe2)
    return np.where(dataframe1, dataframe1, dataframe2)

%timeit lstcomp(d1, d2)
%timeit where(d1, d2)

输出:

233 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
456 ms ± 992 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)