根据两个不同数组的值填充Numpy数组

时间:2019-11-01 09:41:23

标签: python arrays numpy

我有两个5x5x3数组:

A = np.random.randint(0, 255, (5,5,3), np.uint8)
B = np.random.randint(0, 255, (5,5,3), np.uint8)

然后我需要根据A中的值填充第三个数组C(A和B的形状相同)从A或B中填充其值。

纯Python代码应为:

C = np.zeros(A.shape, dtype=np.uint8) 
h, w, ch = C.shape

for y in range(0, h):
    for x in range(0, w):
        for z in range(0, ch):
            if A[y, x, z] > 128:
                C[y, x, z] = max(A[y, x, z], B[y, x, z])
            else:
                C[y, x, z] = min(A[y, x, z], B[y, x, z])

上面的代码可以工作,但是对于大数组来说非常慢。 我对numpy的尝试如下:

C = np.zeros(A.shape, dtype=np.uint8) 
C[A>128] = max(A,B)
C[A<128] = min(A,B) 

但输出为:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

3 个答案:

答案 0 :(得分:2)

使用np.where可以避免之前创建空数组。 np.maximum,np.minimum返回数组,它们的形状与A和B相同。条件A> 128将从中选择正确的值

С = np.where(A>128, np.maximum(A,B), np.minimum(A,B))

答案 1 :(得分:0)

尝试以下代码:

C = np.zeros(shape=A.shape)
C = (A>128)*np.maximum(A,B)+(A<=128)*np.minimum(A,B)

对我来说快5倍。

答案 2 :(得分:0)

Python的min / max函数在numpy ndarray上似乎无法逐元素工作(看来您正在寻找)

您应该可以使用np.maximum和np.minimum

C[A>128] = np.maximum(A,B)[A>128]
C[A<=128] = np.minimum(A,B)[A<=128]