Как заменить значение в матрице, соответствующей другой матрице, некоторым дополнительным ограничением? - PullRequest
0 голосов
/ 19 ноября 2018

Например, это моя входная матрица

a = [['1', '2', '3', '4', '5', '6'],['1', '2', '3', '4', '5', '6'],['1', 
'2', '3', '4', '5', '6']]
b = [[(1, 0.044), (2, 0.042)], [(4, 0.18), (6, 0.023)], [(4, 0.03), (5, 
0.023)]]

И я хочу получить

c= [[0.044, 0.042, 0, 0, 0, 0][0, 0, 0, 0.18, 0, 0.023][0, 0, 0, 0.03,0.023, 
0]]

Матрица a [0] с b [0], если первое значение вb [0] == a [0], затем замените значение в a вторым значением в b и т. д.

И я пытаюсь кодировать так:

bnn = dict(chain.from_iterable(b))
for i in a:
for ii in i:
    c = [bnn.get(i, 0) for i in map(int, ii)]
    print(c)

но он появляется:

[0.044]
[0.042]
[0]
[0.03]
[0.023]
[0.023]
[0.044]
[0.042]
[0]
[0.03]
[0.023]
[0.023]
[0.044]
[0.042]
[0]
[0.03]
[0.023]
[0.023]

Как мне код для этого?

Ответы [ 2 ]

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

A numpy решение с использованием радиовещания, при условии, что a просто "показывает" места.

key,val = np.array(b).T
key = key.astype(int)-1 # -1 because in Python first place is at index 0.
res = zeros_like(a,dtype=val.dtype)
res[range(len(a)),key] = val

Выход:

[[ 0.044  0.042  0.     0.     0.     0.   ]
 [ 0.     0.     0.     0.18   0.     0.023]
 [ 0.     0.     0.     0.03   0.023  0.   ]]
0 голосов
/ 19 ноября 2018

Один из способов сделать это - использовать map, понимание списка и словарь с get:

c = []
for n, i in enumerate(a):
    c.append([dict(b[n]).get(i, 0) for i in map(int, a[n])])
c

Вывод:

[[0.044, 0.042, 0, 0, 0, 0],
 [0, 0, 0, 0.18, 0, 0.023],
 [0, 0, 0, 0.03, 0.023, 0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...