将多 class 数组投影到二进制矩阵中
Project a multi-class array into a binary matrix
我有一个简单的 numpy 数组(例如 [1,4,2,3,1]
)并想将其投影到二进制矩阵中,其中数组中的每个值都映射到矩阵该列中的一个指标。
例如,此数组将映射到如下矩阵:
[1], => [1,0,0,0],
[4], [0,0,0,1],
[2], [0,1,0,0],
[3], [0,0,1,0],
[1] [1,0,0,0]
我可以通过迭代和列表理解来做到这一点,但是有一个优雅的 numpy 解决方案吗?
我们可以使用broadacsting
-
(a[:,None] == np.arange(a.max())+1).astype(int)
样本运行-
In [28]: a = np.array([1,4,2,3,1,2,1,4])
In [29]: a[:,None] == np.arange(a.max())+1 # Booelan array
Out[29]:
array([[ True, False, False, False],
[False, False, False, True],
[False, True, False, False],
[False, False, True, False],
[ True, False, False, False],
[False, True, False, False],
[ True, False, False, False],
[False, False, False, True]], dtype=bool)
In [30]: (a[:,None] == np.arange(a.max())+1).astype(int) # Int array
Out[30]:
array([[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]])
对于非连续的映射整数并且不期望所有 False
列,我们可以直接使用 np.unique(a)
与 2D
版本的输入数组 a
进行比较, 像这样 -
In [49]: a = np.array([14,12,33,71,97])
In [50]: a[:,None] == np.unique(a) # Boolean array
Out[50]:
array([[False, True, False, False, False],
[ True, False, False, False, False],
[False, False, True, False, False],
[False, False, False, True, False],
[False, False, False, False, True]], dtype=bool)
In [51]: (a[:,None] == np.unique(a)).astype(int) # Int array
Out[51]:
array([[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])
我有一个简单的 numpy 数组(例如 [1,4,2,3,1]
)并想将其投影到二进制矩阵中,其中数组中的每个值都映射到矩阵该列中的一个指标。
例如,此数组将映射到如下矩阵:
[1], => [1,0,0,0],
[4], [0,0,0,1],
[2], [0,1,0,0],
[3], [0,0,1,0],
[1] [1,0,0,0]
我可以通过迭代和列表理解来做到这一点,但是有一个优雅的 numpy 解决方案吗?
我们可以使用broadacsting
-
(a[:,None] == np.arange(a.max())+1).astype(int)
样本运行-
In [28]: a = np.array([1,4,2,3,1,2,1,4])
In [29]: a[:,None] == np.arange(a.max())+1 # Booelan array
Out[29]:
array([[ True, False, False, False],
[False, False, False, True],
[False, True, False, False],
[False, False, True, False],
[ True, False, False, False],
[False, True, False, False],
[ True, False, False, False],
[False, False, False, True]], dtype=bool)
In [30]: (a[:,None] == np.arange(a.max())+1).astype(int) # Int array
Out[30]:
array([[1, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[0, 0, 1, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]])
对于非连续的映射整数并且不期望所有 False
列,我们可以直接使用 np.unique(a)
与 2D
版本的输入数组 a
进行比较, 像这样 -
In [49]: a = np.array([14,12,33,71,97])
In [50]: a[:,None] == np.unique(a) # Boolean array
Out[50]:
array([[False, True, False, False, False],
[ True, False, False, False, False],
[False, False, True, False, False],
[False, False, False, True, False],
[False, False, False, False, True]], dtype=bool)
In [51]: (a[:,None] == np.unique(a)).astype(int) # Int array
Out[51]:
array([[0, 1, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]])