如何高效将Numpy一维数组转换为目标格式的布尔二维数组
高效生成置换矩阵的Numpy方法
嘿,这个需求其实就是生成置换矩阵,我平时处理这类问题常用下面两种高效的Numpy实现方式,都是矢量化操作,比手写循环快得多:
方法1:利用单位矩阵的行索引置换
这是最直观的方式,置换矩阵本质就是单位矩阵按照给定的顺序重新排列行。因为你的输入是1-based的索引,我们先转成0-based,再直接索引单位矩阵的行即可:
import numpy as np # 你的输入数组 input_arr = np.array([1, 3, 2]) # 转换为0-based索引 zero_based_idx = input_arr - 1 # 生成对应置换矩阵 perm_matrix = np.eye(len(input_arr), dtype=int)[zero_based_idx] print(perm_matrix) # 输出: # [[1 0 0] # [0 0 1] # [0 1 0]]
这种方法的优势是代码简洁,Numpy的索引操作是高度优化的,处理大数组也毫无压力。
方法2:直接创建全零矩阵并赋值
如果担心单位矩阵的内存开销(比如数组特别大的时候),可以直接初始化全零矩阵,然后通过高级索引给对应位置赋值1:
import numpy as np input_arr = np.array([1, 3, 2]) n = len(input_arr) perm_matrix = np.zeros((n, n), dtype=int) # 行索引是0到n-1,列索引是输入数组转0-based后的结果 perm_matrix[np.arange(n), input_arr - 1] = 1 print(perm_matrix) # 输出和上面一致
这个方法更灵活,比如如果你的输入是其他形式的映射关系,也能轻松调整索引逻辑。
两种方法都是Numpy原生的矢量化操作,效率拉满,完全不需要用Python循环去逐个赋值,推荐根据你的实际场景选择~
内容的提问来源于stack exchange,提问作者William GOGOGO
相关产品推荐
相关产品推荐

