Numpy从一个数组复制非零元素到另一个数组(3D数组)



我的问题是是否有一种简单的方法将非零值从一个numpy 3d数组复制到另一个。我不想为它创建3个for循环。

假设我有一个数组a:

a = np.array([ [ [1,2,3], [4,5,6]],[[7,8,9], [10,11,12] ] ])
# to visualize it better:
# a = np.array([
#   [  
#     [1,2,3], 
#     [4,5,6]
#   ], 
#   [ 
#     [7,8,9], 
#     [10,11,12] 
#   ] 
# ])
#

则存在数组b:

b = np.array([ [[3,0,9], [0,0,0]], [[0,0,0], [45,46,47]] ])
# to visualize it better:
# b = np.array([
#   [  
#     [3,0,9], 
#     [0,0,0]
#   ], 
#   [ 
#     [0,0,0], 
#     [45,46,47] 
#   ] 
# ])
#

我想合并这些数组来接收来自b的非零元素和来自a的其他元素(这些元素在b中是0)因此输出看起来像:


# 
# np.array([
#   [  
#     [3,2,9], 
#     [4,5,6]
#   ], 
#   [ 
#     [7,8,9], 
#     [45,46,47] 
#   ] 
# ])
#

它不必是numpy,它可以是openCV,但我仍然想知道如何实现这一点。

您可以尝试使用np.whereb!=0条件从b中选择,或者从a中选择:

combined_array = np.where(b!=0, b, a)
>>> combined_array
array([[[ 3,  2,  9],
[ 4,  5,  6]],
[[ 7,  8,  9],
[45, 46, 47]]])

应该这样做:

import numpy as np
a = np.array([ [ [1,2,3], [4,5,6]],[[7,8,9], [10,11,12] ] ])
b = np.array([ [[3,0,9], [0,0,0]], [[0,0,0], [45,46,47]] ])
c = b.copy()
c[b==0] = a[b==0]
print(c)
#[[[ 3  2  9]
#  [ 4  5  6]]
#
# [[ 7  8  9]
#  [45 46 47]]]

其中b==0是与b形状相同的数组,如果b中对应的元素等于0,则元素为True,否则为False。然后,您可以使用它来选择b的零元素,并将它们替换为a中这些索引处的值。

编辑:np.where的另一个答案更好。

最新更新