假设我们有这样的数据:
import numpy as np
data = np.array([1,0,1,2,1,2])
我想把它转换成这样:
[0 1 0
1 0 0
0 1 0
0 0 1
0 1 0
0 0 1]
我如何在 Numpy(或其他相关包)中执行此操作?我们有ind2vec
在 MATLAB 中执行此操作的函数。
最佳答案
在 NumPy 中执行此操作的一种相当常见的方法是比较 data
和 arange
并将 bool 数组转换为整数类型:
>>> (np.arange(3) == data[:,None]).astype(int)
array([[0, 1, 0],
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0],
[0, 0, 1]])
更一般地说,如果您想指定 N
列(类似于 Matlab 的函数),这里有一个包含必要步骤的函数。您可以将索引列表 ind
作为 Python 列表或 NumPy 数组传递:
def ind2vec(ind, N=None):
ind = np.asarray(ind)
if N is None:
N = ind.max() + 1
return (np.arange(N) == ind[:,None]).astype(int)
然后举例:
>>> ind2vec([4,0,2])
array([[0, 0, 0, 0, 1],
[1, 0, 0, 0, 0],
[0, 0, 1, 0, 0]])
>>> ind2vec([1,3,2,1,0], N=10)
array([[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
关于python - 在 Numpy 中将索引转换为向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374407/