如何用numpy数组的多个元素对矩阵进行缩放?
用Numpy实现矩阵元素逐个缩放生成高维数组
假设我们有一个4×4的Numpy数组F:
import numpy as np F = np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]])
还有一个3×2的数组A,我们需要用A中的每个元素分别缩放F,最终得到一个形状为(3, 2, 4, 4)的数组,每个位置对应A中元素与F的乘积。
解决方案:利用Numpy广播机制
Numpy的广播特性可以轻松处理这种维度扩展的运算,不需要手动循环。只需要给A添加两个单维度,让它的维度和F对齐,再直接做乘法即可:
A = np.array([[0, 1], [2, 3], [4, 5]]) # 给A添加两个新维度,形状从(3,2)变为(3,2,1,1) output = A[:, :, np.newaxis, np.newaxis] * F
验证结果
生成的output形状为(3, 2, 4, 4),和预期一致,具体内容如下:
print(output) # 输出: array([[[[ 0, 0, 0, 0], [ 0, 0, 0, 0], [ 0, 0, 0, 0], [ 0, 0, 0, 0]], [[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]], [[[ 0, 2, 4, 6], [ 8, 10, 12, 14], [16, 18, 20, 22], [24, 26, 28, 30]], [[ 0, 3, 6, 9], [12, 15, 18, 21], [24, 27, 30, 33], [36, 39, 42, 45]]], [[[ 0, 4, 8, 12], [16, 20, 24, 28], [32, 36, 40, 44], [48, 52, 56, 60]], [[ 0, 5, 10, 15], [20, 25, 30, 35], [40, 45, 50, 55], [60, 65, 70, 75]]]])
原理说明
Numpy广播会自动将维度为1的轴扩展到匹配的长度:
- A添加维度后形状为
(3,2,1,1) - F的形状为
(4,4),会被自动视为(1,1,4,4) - 两者相乘时,每个维度都会扩展到最大的长度,最终得到
(3,2,4,4)的结果,完全符合需求。
内容的提问来源于stack exchange,提问作者learning statistics
相关产品推荐
相关产品推荐

