我有两个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()
答案 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]