2015-09-15 8 views
2

У меня есть NumPy массив, A размера nx1, где каждое значение представляет собой число от 0 до 9.преобразовать Numpy массив размеров NX1 в Numpy массив размеров NX10

Я хотел бы создать новый массив , B размера nx10, так что в B[i] мы храним массив numpy, который содержит нули и 1 в позиции A[i].

Например:

A array 
[[9] 
[2] 
[4] 
[1] 
[8]] 

B array 
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 1] 
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]] 

Есть элегантный способ сделать это с NumPy?

ответ

3

Создайте новый пустой массив, используя numpy.zeros, его размер собирается быть (arr.size, arr.max()), теперь заполнять пункты на тех позициях, используя многомерную индексацию:

>>> arr = np.array([[9], [2], [4], [1], [8]]) 
>>> arr_ = np.zeros((arr.size, arr.max())) 
>>> arr_[np.arange(arr.size), arr[:,0]-1] = 1 
>>> arr_ 
array([[ 0., 0., 0., 0., 0., 0., 0., 0., 1.], 
     [ 0., 1., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 1., 0., 0., 0., 0., 0.], 
     [ 1., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 1., 0.]]) 
0

Что-то, как это будет делать:

A = [[9],[2],[4],[1],[8]] 
B = [[1 if i == j[0] else 0 for i in range(10)] for j in A] 

Это список-ориентированный подход; вы можете просто использовать np.asarray на B, чтобы получить матрицу numpy, или создать матрицу нулей в 10x10 в numpy и заполнить 1s в позициях, продиктованных массивом A.

Последний обобщает случай, когда элементы A могут иметь более одного элемента.

0

Вы могли бы сделать что-то вроде этого , предполагая, что массив NP NX1 Х:

max_val = max(X) 
length_arr = len(X) 
new_arr = np.zeros((max_val,length_arr)) 

Это создаст массив нужного размера, который вы хотите.

for i in range(len(X)): 
    new_arr[i][X[i]-1]=1 

Должны ли после этого назначать правильные значения?

Хорошо работает в моем тестовом корпусе.

Смежные вопросы