给定两个向量,我想创建一个指标矩阵。例如,给定a=np.array([5,5,3,4,4,4])
和b=np.array([5,4,3])
,结果应为
5 4 3
5 1 0 0
5 1 0 0
3 0 0 1
4 0 1 0
4 0 1 0
4 0 1 0
实现这一目标的最简单方法是什么?
答案 0 :(得分:12)
(a[:,None]==b).astype(int)
示例运行 -
In [104]: a
Out[104]: array([5, 5, 3, 4, 4, 4])
In [105]: b
Out[105]: array([5, 4, 3])
In [106]: (a[:,None]==b).astype(int)
Out[106]:
array([[1, 0, 0],
[1, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]])
如果最简单,你的意思是紧凑,这是一个修改后的类型转换 -
In [107]: (a[:,None]==b)*1
Out[107]:
array([[1, 0, 0],
[1, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]])
说明: None
是numpy.newaxis
的别名,用于添加新轴(带length=1
的轴)。因此,在这种情况下,使用a[:,None]
我们会得到2D
a
版本的2D
。有多种其他方法可以使用a.reshape(-1,1)
版本,broadcasting
就是其中之一。与1D
b
进行比较时,这允许int
,从而产生匹配的2D数组,即布尔数组。最后一步是转换为In [141]: a
Out[141]: array([5, 5, 3, 4, 4, 4])
In [142]: b
Out[142]: array([5, 4, 3])
In [143]: a[:,None]
Out[143]:
array([[5],
[5],
[3],
[4],
[4],
[4]])
In [144]: a[:,None] == b
Out[144]:
array([[ True, False, False],
[ True, False, False],
[False, False, True],
[False, True, False],
[False, True, False],
[False, True, False]], dtype=bool)
In [145]: (a[:,None] == b).astype(int)
Out[145]:
array([[1, 0, 0],
[1, 0, 0],
[0, 0, 1],
[0, 1, 0],
[0, 1, 0],
[0, 1, 0]])
数组。
分步运行 -
{{1}}