我有很多大型4D阵列我想取其平均值。这些阵列大多用零填充(> 99%),但每个阵列在不同位置具有非零值。每个数组也有一个相应的数组,用它来衡量它的平均值。
以直接的方式(下面)获取数组的平均值需要很长时间来计算,并且经常会导致内存错误。
>>> a, b, weights_a, weights_b = [np.zeros((150,150,150,150)) for i in range(4)]
>>> valInds_a = np.random.randint(0,a.size,7000)
>>> valInds_b = np.random.randint(0,b.size,7000)
>>> a.ravel()[valInds_a] = np.random.random(7000)
>>> weights_a.ravel()[valInds_a] = np.random.random(7000)
>>> b.ravel()[valInds_b] = np.random.random(7000)
>>> weights_b.ravel()[valInds_b] = np.random.random(7000)
>>> avg = np.average([a,b],0, weights = [weights_a,weights_b])
我正在寻找一种更快的计算机方法。我想可能有一种方法,因为大多数值都是零。我研究了使用稀疏数组,但它们不支持具有2个以上维度的数组。
答案 0 :(得分:2)
执行此操作的一种方法是仅取b
或valInds_a
中的任何一个非零的平均值,因为我们知道平均值将为零。
如果您可以访问valInds_b
和valInds_both = np.union1d(valInds_a, valInds_b)
avg = np.zeros_like(a)
avg.ravel()[valInds_both] = np.average(
[a.ravel()[valInds_both], b.ravel()[valInds_both]],
axis=0,
weights=[weights_a.ravel()[valInds_both], weights_b.ravel()[valInds_both]])
,则可以这样做:
@supports not (mix-blend-mode: multiply) {
.image {
...
}
}