如何高效将1元素位置向量集合转为N=5目标矩阵?求numpy方案
问题描述
现有矩阵中1元素的位置集合:
{(0, 1), (2, 1), (0, 0), (1, 1), (1, 0)}
需要将其转换为大小N=5的目标矩阵:
[[1,1,0,0,0], [1,1,0,0,0], [0,1,0,0,0], [0,0,0,0,0], [0,0,0,0,0]]
请问是否存在高效实现方式?例如numpy内置函数?逐个遍历位置赋值1的方法效率较低,最终生成的矩阵将用于matplotlib的matshow()函数。
高效实现方案
当然有更高效的numpy实现方式,无需逐个遍历赋值:
拆分坐标批量赋值(推荐)
先把位置集合转换为数组,拆分出行、列两组坐标,再直接对numpy矩阵的对应位置批量赋值:import numpy as np positions = {(0, 1), (2, 1), (0, 0), (1, 1), (1, 0)} N = 5 # 将位置集合转为数组并拆分行、列坐标 rows, cols = np.array(list(positions)).T # 初始化N×N的全0矩阵 mat = np.zeros((N, N), dtype=int) # 批量给指定位置赋值1 mat[rows, cols] = 1这种方式利用numpy的向量化操作,比循环遍历效率高很多,位置数量越大,优势越明显。
处理重复坐标的备选方案
如果你的位置集合中可能存在重复坐标(需要对重复位置累加计数),可以使用np.add.at方法;若只是单纯赋值1,上面的方法更简洁:mat = np.zeros((N, N), dtype=int) np.add.at(mat, (rows, cols), 1)
生成的矩阵可以直接传入matplotlib.pyplot.matshow(mat)使用,完全兼容。
内容的提问来源于stack exchange,提问作者Spinor8
相关产品推荐
相关产品推荐

