小能豆

将函数应用于所有两个一维数组对,以获得一个二维数组

python

假设我有 2 个一维 (1D) numpy 数组ab,长度分别为n1n2。我还有一个函数 ,F(x,y)它有两个值。现在我想将该函数应用于两个一维数组中的每对值,因此结果将是一个形状为 的 2D numpy 数组n1, n2i, j二维数组的元素是F(a[i], b[j])

我一直无法找到一种没有大量 for 循环的方法来做到这一点,而且我确信在 numpy 中有一种更简单(更快!)的方法来做到这一点。

提前致谢!


阅读 77

收藏
2024-05-14

共1个答案

小能豆

你可以使用numpy的向量化操作来高效地实现这一点,而不需要使用显式的for循环。以下是你可以做到这一点的方法:

import numpy as np

# 定义你的函数 F(x, y)
def F(x, y):
    return x + y  # 举例函数,替换为你的实际函数

# 创建 1D numpy 数组 a 和 b
a = np.array([1, 2, 3])
b = np.array([4, 5, 6, 7])

# 使用numpy的广播特性将函数应用于每对元素
result = F(a[:, np.newaxis], b)

print(result)

这将输出:

[[ 5  6  7  8]
 [ 6  7  8  9]
 [ 7  8  9 10]]

解释:

  • a[:, np.newaxis] 将1D数组 a 重新形状为形状为 (n1, 1) 的2D数组,实际上创建了一个列向量。
  • b 已经是一个1D数组。
  • 当你将函数 F 应用于 a[:, np.newaxis]b 时,numpy会自动将数组广播到匹配它们的形状。它本质上在两个数组的所有组合元素之间执行逐元素操作。
  • 结果是一个2D numpy数组,其中 (i, j) 元素包含 F(a[i], b[j]) 的结果。

用你的实际函数替换 F(x, y),这种方法应该可以有效地适用于你的情况。

2024-05-14