簡體   English   中英

將索引轉換為Numpy中的向量

[英]Convert indices to vectors in 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函數。

在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]])

一種方法是:

import numpy as np
data = np.array([1,0,1,2,1,2])

idx = np.zeros((data.size, data.max()+1))
idx[np.arange(data.size), data] = 1
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.]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM