Skip to content

numpy 广播机制

问题场景,我要算 k*x,其中 x 是向量,即横坐标 [x1, x2, x3, ...],而 k 也是向量,它表示不同的直线下的斜率。假设 x 的大小是 n,同时 k 的大小是 m,那么最后算出的 y=k*x 大小为 n*m,如何用广播机制方便的求出来?

解答: 其实只要牢牢记住:判断广播机制能成功是从后往前比较的,如 (2, 3) 和 (1, 4, 2, 3) 是可以的;而且有特例是 1 可以匹配任何数,即 (2, 1) 和 (1, 4, 2, 3) 也是可以通过广播机制的,结果会是 (1, 4, 2, 3)。

那么我们现在有 (n) 和 (m),肯定不行,所以随便给任意一个 ndarray 升一个维度就行,如 (n, 1) 和 (m),就可以了。

import numpy as np
x = np.array([1, 2, 3])
k = np.array([1, 2])

# print(k * x) --> 错误

# 只要其中升一个维度即可
print( k[:, np.newaxis] * x )
print( x * k[:, np.newaxis] )
    [[1 2 3]
     [2 4 6]]
    [[1 2 3]
     [2 4 6]]

Comments