2015-01-26 5 views
1

Предположим, мы имеем следующий вектор:Преобразование вектора на матрицу маски с использованием NumPy

v = np.array([4, 0, 1]) 

Цель заключается в создании 5 х 3 матрицу M следующим образом:

[[0 1 0] 
[0 0 1] 
[0 0 0] 
[0 0 0] 
[1 0 0]] 

Только один элемент в каждом столбце равен 1 для соответствующего индекса в v. Например, поскольку v[0] составляет 4, то M[4, 0] == 1, а с v[2] - 1, затем M[1, 2] == 1.

Как я могу построить такую ​​матрицу в Python, используя scipy и numpy? В MATLAB вы можете сделать это с помощью функций sparse и full в одной строке. Я бы предпочел не использовать цикл for, так как я ищу векторную реализацию этого.

+0

Чтобы быть ясным, вы хотите, чтобы выходная матрица была разреженной или плотной? –

+0

Я буду использовать эту «М» в качестве матрицы масок для отмены некоторых значений путем умножения по элементам (exp: result = A. * M). M будет огромным ex "100,000x10". Поэтому моя цель - использовать наиболее оптимизированный. Либо плотный, либо разреженный был бы прекрасен, пока он быстр и векторизован. – superMind

+1

@superMind, тогда вам, вероятно, нужна разреженная матрица. – elyase

ответ

1

Если вы хотите густую выходной массив, вы можете использовать только два целочисленных массива, чтобы индексировать строки/смещ_по_столбцам ненулевых элементов:

v = np.array([4, 0, 1]) 
x = np.zeros((5, 3), np.int) 
x[v, np.arange(3)] = 1 

print(x) 
# [[0 1 0] 
# [0 0 1] 
# [0 0 0] 
# [0 0 0] 
# [1 0 0]] 
1

Вы можете сделать:

from scipy import sparse 

inds = np.array([4, 0, 1]) 
values = np.ones_like(inds)  # [1, 1, 1] 
index = np.arange(inds.shape[0]) # 3 
m = sparse.csc_matrix((values, (inds, index)), shape=(5, 3)) 

Выход:

>>> m.todense() 
matrix([[0, 1, 0], 
     [0, 0, 1], 
     [0, 0, 0], 
     [0, 0, 0], 
     [1, 0, 0]]) 
Смежные вопросы