numpy 跨多个阵列移动窗口计算

bfrts1fy  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(154)

我将几个二维数据数组加载到NumPy数组中,它们的维度都是相同的,这些共享维度是2606x和1228y。
我感兴趣的是在移动窗口中计算前两个数组(a1和a2)之间的计算,使用大小为2x x x 2y的窗口,然后将结果计算应用于第三个数组。
1.求出a1在该移动窗口段上的最大值和最小值
1.选择这些值对应的数组索引
1.提取a2的这些索引处的值
1.将计算结果投射到移动窗口内的第三数组(a3)中的每个索引。
我知道这个过程涉及到以下几段代码来获取我需要的值:

idx1 = np.where(a1 == a1.max())
idx2 = np.where(a1 == a1.min())
val1 = a2[idx1[1], idx1[2]]
val2 = a2[idx2[1], idx2[2]]

要沿着相同大小的数组执行此移动窗口,还需要哪些代码?

tzdcorbm

tzdcorbm1#

由于数组形状可以被窗口大小整除,因此可以使用numpy.reshape将数组拆分为多个小窗口,从而使原始数组形状(2606, 1228)变为(2606/2, 2, 1228/2, 2)
如果numpy.argmin接受轴序列,这将更容易,但由于它只接受一个轴(或None,但我们不希望这样),我们需要将两个窗口轴压缩成一个轴。为此,我们使用numpy.moveaxis使形状(2606/2, 1228/2, 2, 2),然后再次使用numpy.reshape将最后两个轴展平成(2606/2, 1228/2, 4)
解决了这个问题后,我们可以使用最后一个轴上的numpy.argminnumpy.argmax来计算您感兴趣的索引,并使用高级索引将a2的相应值写入a3。之后,我们只需撤消对a3执行的reshapemoveaxis操作。

import numpy as np

shape = (4, 6)
a1 = np.random.random(shape)
a2 = np.random.random(shape)
a3 = np.zeros(shape)

win_x = 2
win_y = 2

shape_new = (shape[0] // win_x, win_x, shape[1] // win_y, win_y)

a1_r = np.moveaxis(a1.reshape(shape_new), 1, 2).reshape(*shape_new[::2], -1)
a2_r = np.moveaxis(a2.reshape(shape_new), 1, 2).reshape(*shape_new[::2], -1)
a3_r = np.moveaxis(a3.reshape(shape_new), 1, 2).reshape(*shape_new[::2], -1)

index_x, index_y = np.indices(shape_new[::2])
index_min = np.argmin(a1_r, axis=-1)
index_max = np.argmax(a1_r, axis=-1)

a3_r[index_x, index_y, index_min] = a2_r[index_x, index_y, index_min]
a3_r[index_x, index_y, index_max] = a2_r[index_x, index_y, index_max]

a3 = np.moveaxis(a3_r.reshape(*shape_new[::2], win_x, win_y), 2, 1).reshape(shape)

print(a1)
print()
print(a2)
print()
print(a3)

产出

[[0.54885307 0.74457945 0.84943538 0.14139329 0.68678556 0.03460323]
 [0.74031057 0.5499962  0.03148748 0.13936734 0.05006111 0.88850868]
 [0.97789608 0.13262023 0.76350358 0.74640822 0.7918286  0.80675845]
 [0.35784598 0.20918229 0.82880072 0.06051794 0.0825886  0.6398353 ]]

[[0.66176657 0.10120202 0.15306892 0.05963046 0.79057051 0.08837686]
 [0.78550049 0.09918834 0.00213652 0.61053454 0.42966757 0.25952916]
 [0.00387273 0.78247644 0.65549303 0.39351233 0.11002493 0.55652453]
 [0.06047582 0.87997514 0.60820023 0.06705212 0.34581512 0.93504438]]

[[0.66176657 0.10120202 0.15306892 0.         0.         0.08837686]
 [0.         0.         0.00213652 0.         0.         0.25952916]
 [0.00387273 0.78247644 0.         0.         0.         0.55652453]
 [0.         0.         0.60820023 0.06705212 0.34581512 0.        ]]

相关问题