我有两个很大的 np.uint8 数组,a 和 b。我需要计算: c = np.sum(np.abs(a - b), axis=(-2,-1,))
由于它们是无符号的,我不能直接相减。解决这个问题的一种简单方式是将它们转换为更大的数据类型:
由于它们是无符号的,我不能直接相减。解决这个问题的一种简单方式是将它们转换为更大的数据类型:
c = np.sum(np.abs(a.astype(np.int16) - b.astype(np.int16)), axis=(-2,-1,))
总共使用数组内存的4倍。在理想情况下,我希望能够像这样做:
c = np.sum(np.abssub(a, b), axis=(-2,-1,))
我希望有一个和数组一样占用相同内存的数据结构。可惜在NumPy的文档中找不到类似的函数。目前我采取以下方式:
diff = np.empty_like(a)
mask = a > b
diff[mask] = (a - b)[mask]
# b shape is different but broadcasts to a
# That is why I use mask after substracting
mask = np.logical_not(mask, out=mask)
diff[mask] = (b - a)[mask]
c = np.sum(np.abs(diff, out=diff), axis=(-2,-1,))
这种使用方式的内存占用仅是数组内存占用的2.5倍。
有更好的方法吗?
* 4 times = bytes(a) + bytes(b) + bytes(a.astype(np.int16)) + bytes(b.astype(np.int16)) + bytes(a.astype(np.int16) - b.astype(np.int16))
--------- 1 -------- ----------- 2 ---------- ----------- 3 ----------- --------------------- 4 ---------------------
** 2.5 times = bytes(a) + bytes(b) + bytes(diff) + bytes(mask) + bytes(a - b | b - a)
--------- 1 -------- ------------ 2 ---------- ------- 2.5 -------
a
和b
的值以便重复使用它们的内存空间? - Ericnp.copyto(diff, (b - a), where=mask)
will use less memory thandiff[mask] = (b - a)[mask]
- Eric