如何用Numpy优雅实现基于两个列表的二维数组透视表?
利用Numpy向量化操作替代循环实现布尔匹配矩阵
你可以通过Numpy的广播机制实现完全向量化的操作,彻底去掉循环,代码更简洁高效:
实现代码
import numpy as np list_1 = ["A", "B", "C"] list_2 = ["D", "A", "B"] # 将列表转为numpy数组 arr_1 = np.array(list_1) arr_2 = np.array(list_2) # 利用广播生成匹配矩阵,再转为float类型 result = (arr_2[:, np.newaxis] == arr_1).astype(float) print(result)
输出结果
array([[0., 0., 0.], [1., 0., 0.], [0., 1., 0.]])
原理说明
arr_2[:, np.newaxis]将形状为(3,)的arr_2转换为(3,1)的列向量- Numpy的广播机制会自动将这个列向量与形状为
(3,)的arr_1扩展为相同的(3,3)维度,逐元素进行相等性比较 - 最后用
astype(float)将布尔值(True/False)转换为对应的浮点数值(1./0.),与你期望的输出格式一致
简化写法
你也可以用 [:, None] 替代 [:, np.newaxis],效果完全相同:
result = np.equal(arr_2[:, None], arr_1).astype(float)
这种向量化操作比循环更高效,尤其是当列表规模较大时,能充分发挥Numpy的底层优化优势。
内容的提问来源于stack exchange,提问作者Jaroslav Bezděk
相关产品推荐
相关产品推荐

