如何对3D NumPy矩阵提取的向量做两两元素相减生成目标矩阵
NumPy实现向量两两元素相减生成差值矩阵
现有数据
首先构造示例3D NumPy矩阵:
import numpy as np arr = np.random.random([4, 3, 4])
对矩阵执行切片取目标向量:
v = arr[:,0,0] # 输出为 array([0.86061437, 0.26045360, 0.21532865, 0.15602922])
需求说明
需要生成二维矩阵,矩阵中每个位置(i,j)的取值为向量中第i个元素减去第j个元素,即向量每个元素和其余所有元素依次相减的结果组合,效果如下图黄色区域所示:
实现方法
你之前直接对一维数组取转置再相减的思路问题在于:一维NumPy数组的转置和原数组形状完全一致,不会生成列向量,直接相减只会得到逐元素差值的一维数组。只要先将向量升维为列向量,触发NumPy广播机制,即可直接得到目标差值矩阵,常用实现方式有以下三种:
- 维度扩展广播(最简洁常用):用
None(等价于np.newaxis)给向量增加一个长度为1的维度再做减法diff_matrix = v[:, None] - v - reshape升维:通过reshape将一维向量转为列向量再做减法
diff_matrix = v.reshape(-1, 1) - v - ufunc外运算:直接调用减法通用函数的
outer方法,计算所有两两组合的差值diff_matrix = np.subtract.outer(v, v)
以上三种写法得到的结果完全一致,针对示例中的v,输出结果为:
array([[ 0. , 0.60016077, 0.64528572, 0.70458515], [-0.60016077, 0. , 0.04512495, 0.10442438], [-0.64528572, -0.04512495, 0. , 0.05929943], [-0.70458515, -0.10442438, -0.05929943, 0. ]])
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

