Создание новой матрицы на основе значений словаря и списка - PullRequest
0 голосов
/ 10 ноября 2018

Ниже приведен упрощенный пример:

val = [10,23,45,31,78,43,1,67,82]

indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]

samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3

Скажем, у меня есть словарь (выборка), который имеет две группы: Группа 0 и Группа 1. В словаре есть указатели для значений в векторе val.

Я хочу вытащить все значения в val на основе заданной группы в словаре, создав матрицу 8 X 2, Где у меня есть группа и значение в двух столбцах в порядке индекса, так что это выглядит так:

val  group
10   2
23   0
45   2
31   0
87   0
43   1
1    1
67   0
82   1

Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Вот решение без использования панд, которое выводит (8,2) пустую матрицу:

val = [10,23,45,31,78,43,1,67,82]

indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]

indices = [indx, indx2, indx3]

def get_group(x):
    for i,indx_arr in enumerate(indices):
        if x in indx_arr:
            return i

pairs = [(v,get_group(i)) for i,v in enumerate(val)]
np.asarray(pairs)

array([[10,  2],
   [23,  0],
   [45,  2],
   [31,  1],
   [78,  0],
   [43,  0],
   [ 1,  1],
   [67,  1],
   [82,  0]])
0 голосов
/ 10 ноября 2018

Один способ получить это

[(j, next(k for k,v in samp.items() if i in v)) for i,j in enumerate(val)]

Выход:

[(10, 2),
 (23, 0),
 (45, 2),
 (31, 1),
 (78, 0),
 (43, 0),
 (1, 1),
 (67, 1),
 (82, 0)]
0 голосов
/ 10 ноября 2018

Используйте dictionary comprehension для изменения ключа, пар значений в словаре, а затем используйте map:

df = pd.DataFrame(val,columns=['val'])
d = {value1:key  for key,value in samp.items() for value1 in value}
df['group'] = df.index.map(d)

print(df)
   val  group
0   10      2
1   23      0
2   45      2
3   31      1
4   78      0
5   43      0
6    1      1
7   67      1

print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}

Что делать, если значения являются массивами с номерами:

indx = np.array([1,4,5,8])
indx2 = np.array([3,6,7])
indx3 = np.array([0,2])

samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3

print(samp)
{0: array([1, 4, 5, 8]), 1: array([3, 6, 7]), 2: array([0, 2])}

d = {value1:key  for key,value in samp.items() for value1 in value}

print(d)
{1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
...