在Python Numpy中从两个数组创建指标矩阵

时间:2017-07-12 17:09:02

标签: python numpy

给定两个向量,我想创建一个指标矩阵。例如,给定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

实现这一目标的最简单方法是什么?

1 个答案:

答案 0 :(得分:12)

使用NumPy broadcasting -

(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]])

说明: Nonenumpy.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}}