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

Dav*_*vid 8 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
Run Code Online (Sandbox Code Playgroud)

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

Div*_*kar 12

使用NumPy broadcasting-

(a[:,None]==b).astype(int)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

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]])
Run Code Online (Sandbox Code Playgroud)

如果最简单,你的意思是紧凑,这里是一个修改过的类型转换 -

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]])
Run Code Online (Sandbox Code Playgroud)

说明: None是别名numpy.newaxis,用于添加新轴(带轴length=1).所以,在这种情况下,a[:,None]我们得到一个2D版本a.有其他方法可以使用这个2D版本,a.reshape(-1,1)其中之一就是其中之一.这允许broadcasting在进行比较时1D b产生匹配的2D数组,即布尔数组.最后一步是转换为int数组.

一步一步的运行 -

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]])
Run Code Online (Sandbox Code Playgroud)