将索引转换为Numpy中的向量

时间:2015-05-21 12:54:54

标签: python matlab numpy

假设我们有这些数据:

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函数来执行此操作。

3 个答案:

答案 0 :(得分:3)

在NumPy中执行此操作的一种相当常见的方法是将dataarange进行比较,并将布尔数组转换为整数类型:

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