2D Numpy数组的条件和

时间:2017-10-31 11:29:00

标签: python numpy

我有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)

enter image description here

编辑:我提出了一个糟糕的递归解决方案,至少可以显示我正在寻找的结果。我希望有人可以提供更清洁的方法,特别是那不是递归方式

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])

enter image description here

1 个答案:

答案 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))