如何将N维向量转换为N(N-1)/2维列向量?代码问题排查
问题:生成的向量维度不符合N(N-1)/2要求
我的操作步骤:
- 通过堆叠列向量构建方阵
- 将该矩阵与其转置比较,得到方形二进制矩阵
- 将二进制矩阵的上三角或下三角部分(不含对角线)向量化为长度为N(N-1)/2的列向量
当前代码生成的结果维度不符合要求:
import numpy as np arr = np.array([2, 4, 2, 1, 1, 3, 4, 2]) bin_nums = ((arr.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) bin_nums = bin_nums[:,::-1] a = bin_nums a_T = bin_nums.transpose() b = (a == a_T).astype(int) c = b[np.triu_indices(8)]
问题原因
np.triu_indices(8)默认会包含矩阵的对角线元素,提取的元素总数是8*(8+1)/2=36,但你需要的是不含对角线的上三角部分,元素总数应为8*(8-1)/2=28,这就是维度不符的核心原因。
修正方案
使用np.triu_indices(8, k=1),参数k=1表示只选取对角线以上(不包含对角线)的元素;如果需要下三角部分,替换为np.tril_indices(8, k=-1)即可。
修正后的代码:
import numpy as np arr = np.array([2, 4, 2, 1, 1, 3, 4, 2]) bin_nums = ((arr.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) bin_nums = bin_nums[:,::-1] a = bin_nums a_T = bin_nums.transpose() b = (a == a_T).astype(int) # 提取不含对角线的上三角元素 c = b[np.triu_indices(8, k=1)] # 验证维度:print(c.shape) 输出 (28,),符合8*7/2=28的要求
内容的提问来源于stack exchange,提问作者Sean_TBI_Research
相关产品推荐
相关产品推荐

