假设我们有这些数据:
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(或其他相关包)中执行此操作?我们在MATLAB中有ind2vec
函数来执行此操作。
答案 0 :(得分:3)
在NumPy中执行此操作的一种相当常见的方法是将data
与arange
进行比较,并将布尔数组转换为整数类型:
>>> (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]])
答案 1 :(得分:1)
一种方法是:
join file1.coo file2.coo > out.txt
答案 2 :(得分:0)
def ind_to_vec(data):
maxd = max(data)
mind = min(data)
b = np.zeros([len(data),maxd-mind+1])
for ii in range(mind,maxd+1):
for jj in range(len(data)):
if data[jj]==ii:
b[jj,ii]=1
return b
它遍历输入数组中的每个可能值,并检查它是什么值。然后,它会填充一个否则为零的数组,该列的值为1。输入数据的输出为
array([[ 0., 1., 0.],
[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.],
[ 0., 0., 1.]])