numpy - 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 广播
- 如果它们兼容,则可以对两个数组进行操作
- 操作通常与广播一起完成
- 用外行术语广播可以称为沿指定轴的重复元素
- 播出条件
- 数组需要兼容
- 兼容性取决于它们的形状
- 从右到左比较形状。
- 比较时从右到左,它们应该相等或其中之一应该是 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)
推荐阅读
- amazon-cloudwatch - AWS Cloudwatch Logs Insights 查找接近另一个日志或时间戳的日志
- android - 位图无法在线性布局中正确加载
- angular - 重新实例化数据时,Angular CDK 拖放列表会中断
- java - 强制客户端或服务器重新启动 SSL 握手(或使 SSL 会话过期)
- java - Intellij 警告:布尔方法 foo() 总是被反转
- javascript - 字符串中的替代大写
- matlab - 可以在运行时更改属性属性
- java - 如何使用 java 流对子列表中的元素进行分组和计数
- python - TensorFlow CNN 训练无故停止
- python-3.x - Robot Framework 中未找到变量错误