首页 > 解决方案 > numpy数组的数组加起来另一个数组

问题描述

我有以下数组数组

a = np.array([[1,2,3],[4,5,6]]) 
b = np.array([[1,5,10])

并希望将 b 中的值加到 a 中,例如

np.array([[2,7,13],[5,10,16]]) 

实现目标的最佳绩效方法是什么?

谢谢

标签: numpy

解决方案


根据输入的大小和时间限制,两种方法都可能需要考虑

方法一:Numpy 广播

  • 如果它们兼容,则可以对两个数组进行操作
  • 操作通常与广播一起完成
  • 用外行术语广播可以称为沿指定轴的重复元素
  • 播出条件
    • 数组需要兼容
    • 兼容性取决于它们的形状
    • 从右到左比较形状。
    • 比较时从右到左,它们应该相等或其中之一应该是 1
    • 较小的数组在较大的数组上广播(重复)
a.shape, b.shape
((2, 3), (1, 3))

从规则上看是兼容的,所以可以相加,b比较小,所以b是长1维重复的,所以b可以看成[[ 5, 10, 16], [ 5, 10, 16]]。但请注意 numpy 不会分配新内存,它只是视图。

a + b
array([[ 2,  7, 13],
       [ 5, 10, 16]])

方法 2:Numba

  • Numba 提供并行性
  • 它将转换为优化的机器代码
  • 为什么这是因为,有时 numpy 广播不够好,ufuncs(np.add,np.matmul 等)在操作期间分配临时内存,如果已经在内存限制上可能会很耗时
  • 易于并行化
  • 根据您的要求使用 numba,您可能不需要临时内存分配或 numpy 所做的各种检查,例如,这可以加速大量输入的代码。为什么 np.hypot 和 np.subtract.outer 非常快?
import numba as nb

@nb.njit(parallel=True)
def sum(a, b):
    s = np.empty(a.shape, dtype=a.dtype)
    # nb.prange gives numba hint to what to parallelize
    for i in nb.prange(a.shape[0]):
        s[i] = a[i] + b
    return s
sum(a, b)

推荐阅读