2016-01-18 4 views
0

У меня есть Numpy массив, который выглядит следующим образом:Разделить NumPy массива с помощью массива ключей

+----+-------+----------------+ 
| id | class | probability | 
+----+-------+----------------+ 
| 0 | 0 | 0.371301944865 | 
| 0 | 1 | 0.317619162391 | 
| 0 | -1 | 0.311078922721 | 
| 1 | 0 | 0.401434454687 | 
| 1 | 1 | 0.316000976419 | 
| 1 | -1 | 0.282564557522 | 
| 2 | 1 | 0.361490456577 | 
| 2 | 0 | 0.324832048066 | 
| 2 | -1 | 0.313677512904 | 
| . | . | .    | 
| . | . | .    | 
| . | . | .    | 
+----+-------+----------------+ 

или более формально:

x = numpy.array([[ 0.00000000e+00, 0.00000000e+00, 3.71301945e-01], 
     [ 0.00000000e+00, 1.00000000e+00, 3.17619162e-01], 
     [ 0.00000000e+00, -1.00000000e+00, 3.11078923e-01], 
     [ 1.00000000e+00, 0.00000000e+00, 4.01434455e-01], 
     [ 1.00000000e+00, 1.00000000e+00, 3.16000976e-01], 
     [ 1.00000000e+00, -1.00000000e+00, 2.82564558e-01], 
     [ 2.00000000e+00, 1.00000000e+00, 3.61490457e-01], 
     [ 2.00000000e+00, 0.00000000e+00, 3.24832048e-01], 
     [ 2.00000000e+00, -1.00000000e+00, 3.13677513e-01]]) 

Как вы можете видеть, для каждого идентификатора, у меня есть три класса, каждая с вероятностью. Я хотел бы преобразовать это в массив из четырех столбцов следующим образом:

id/class   -1    0    1 
0    0.311078922721 0.371301944865 0.317619162391 
1    0.282564557522 0.401434454687 0.316000976419 
.    .     .    . 
.    .     .    . 
.    .     .    . 

Есть ли быстрый/чистый способ сделать это ?!

ответ

1

сцепить идентификатор с данными: np.hstack((a[:,0][::3][:,None],a[:,2].reshape(-1,3)))

Например:

a=np.array([[i//3,i%3-1,np.random.random()] for i in range (15)]) 
# a=a[np.argsort(a[:,1])][np.argsort(a[:,0])] #if not sorted 
print(a) 
id=a[::3,0][:,None] 
data =a[:,2].reshape(-1,3) 
print(np.hstack((id,data))) 

дает

[[ 0.   -1.   0.78556868] 
[ 0.   0.   0.29483601] 
[ 0.   1.   0.74003482] 
[ 1.   -1.   0.00673232] 
[ 1.   0.   0.43262104] 
[ 1.   1.   0.92925208] 
[ 2.   -1.   0.26060377] 
[ 2.   0.   0.21186242] 
[ 2.   1.   0.88388227] 
[ 3.   -1.   0.53816376] 
[ 3.   0.   0.82545746] 
[ 3.   1.   0.53964188] 
[ 4.   -1.   0.63082784] 
[ 4.   0.   0.45693351] 
[ 4.   1.   0.38970428]] 

[[ 0.   0.78556868 0.29483601 0.74003482] 
[ 1.   0.00673232 0.43262104 0.92925208] 
[ 2.   0.26060377 0.21186242 0.88388227] 
[ 3.   0.53816376 0.82545746 0.53964188] 
[ 4.   0.63082784 0.45693351 0.38970428]] 

панды может дать вам хорошие решения тоже.

+0

Спасибо, но, к сожалению, это не будет работать, как классы не упорядочены одинаковым для каждого идентификатора (посмотрите на пример, я предоставил)! – Angelica

+0

Вы можете легко отсортировать данные с помощью 'x = x [np.argsort (x [:, 1])]', а затем 'x = x [np.argsort (x [:, 0])]'. Затем у вас есть данные, отсортированные по id и классам, и вы можете использовать reshape. Тем не менее, я думаю, что решение Pandas является более чистым и простым, если вы хотите его использовать. – kazemakase

+0

Редактировать: спасибо @kazemakase. Я добавляю строку для сортировки. –

3

Вот решение по панд:

import pandas as pd 
import numpy as np 

x = np.array([[ 0.00000000e+00, 0.00000000e+00, 3.71301945e-01], 
     [ 0.00000000e+00, 1.00000000e+00, 3.17619162e-01], 
     [ 0.00000000e+00, -1.00000000e+00, 3.11078923e-01], 
     [ 1.00000000e+00, 0.00000000e+00, 4.01434455e-01], 
     [ 1.00000000e+00, 1.00000000e+00, 3.16000976e-01], 
     [ 1.00000000e+00, -1.00000000e+00, 2.82564558e-01], 
     [ 2.00000000e+00, 1.00000000e+00, 3.61490457e-01], 
     [ 2.00000000e+00, 0.00000000e+00, 3.24832048e-01], 
     [ 2.00000000e+00, -1.00000000e+00, 3.13677513e-01]]) 

df = pd.DataFrame(x, columns=["id", "class", "p"]) 
df.pivot(index="id", columns="class", values="p") 

выход:

class  -1   0   1 
id         
0  0.311079 0.371302 0.317619 
1  0.282565 0.401434 0.316001 
2  0.313678 0.324832 0.361490 
0

Вы можете также использовать unstack в pandas

с той же ф.р. @HYRY используется, добавьте:

df.set_index(["id","class"]).unstack("class").reset_index() 

результат:

 id   p      
class   -1.0  0.0  1.0 
0  0 0.311079 0.371302 0.317619 
1  1 0.282565 0.401434 0.316001 
2  2 0.313678 0.324832 0.361490 
Смежные вопросы