我有4个(但实际上是任意数量的)2D数组,如下所示:
import numpy as np
c1 = np.ones((75, 100))
c2 = np.ones((75, 100))
c3 = np.ones((75, 100))
c4 = np.ones((75, 100))
c1[22:42, 5:35] = np.random.rand(20, 30) / 2
c2[25:45, 25:55] = np.random.rand(20, 30) / 2
c3[28:48, 45:75] = np.random.rand(20, 30) / 2
c4[31:51, 65:95] = np.random.rand(20, 30) / 2
我想做的是将数组求和,除了数组重叠的地方。如果存在重叠,则值应该是左数组。我的直觉是使用np.where
,但我想不出这样聪明/干练的方式。
希望下面的图片清楚显示
c_arrays = np.array([c1, c2, c3, c4])
result = c_arrays.sum(axis=0)
fig, ax = plt.subplots()
ax.imshow(result)
编辑:我提出了一个糟糕的递归解决方案,至少可以显示我正在寻找的结果。我希望有人可以提供更清洁的方法,特别是那不是递归方式
c_arrays_1 = []
for ci, cj in zip(c_arrays, c_arrays[1:]):
c = np.where(ci + cj < 1, ci, ci + cj - 1)
c_arrays_1.append(c)
c_arrays_2 = []
for ci, cj in zip(c_arrays_1, c_arrays_1[1:]):
c = np.where(ci + cj < 1, ci, ci + cj - 1)
c_arrays_2.append(c)
c_arrays_3 = []
for ci, cj in zip(c_arrays_2, c_arrays_2[1:]):
c = np.where(ci + cj < 1, ci, ci + cj - 1)
c_arrays_3.append(c)
fig, ax = plt.subplots()
ax.imshow(c_arrays_3[0])
答案 0 :(得分:1)
这是一种我认为符合您要求的递归方法:
def condsum(*arrs, r = 1):
if len(arrs) == 1:
return arrs[0]
else:
a = condsum(*arrs[1:], r = r)
return np.where(a == r, arrs[0], a)
然后你只需要做
plt.imshow(condsum(c1, c2, c3, c4))