2015-06-08 3 views
-3

Каждый элемент массива «данные» должны быть изменены следующим образом:расположение элементов в Python

Например, 4 следует рассматривать в names_A и data_A. Названия_A для 4 - это «Давид». Теперь «Давид» следует видеть в именах_B и data_B. Data_B для 'David' равен 30. Итак, элемент 4 должен быть изменен на 30; и так далее.

import numpy as np 

names_A = ['David', 'Mark', 'Brian', 'Michael'] 
data_A = [4,3,1,2] 

names_B = ['Mark', 'David', 'Michael', 'Brian'] 
data_B = [51,30,11,29] 

data = np.array([[4,4,3,3,2,2,1,1,3,3], 
       [4,3,3,3,2,2,3,1,3,1], 
       [4,2,3,3,2,2,4,1,4,3]]) 

Как самый простой и простой способ сделать это?

Я попробовал его следующим образом:

dats = data.ravel() 

results = [] 
for d in dats: 
    nam_A = names_A[data_A == int(d)] 
    dat_B = data_B[names_B == nam_A] 
    results.append(dat_B) 

print np.array(results).reshape(data.shape) 


[[51 51 51 51 51 51 51 51 51 51] 
[51 51 51 51 51 51 51 51 51 51] 
[51 51 51 51 51 51 51 51 51 51]] 

Но это дает неправильные результаты. Как бы вы это сделали?

ответ

1

Используйте словари, чтобы создать сопоставление.

names_A = ['David', 'Mark', 'Brian', 'Michael'] 
data_A = [4,3,1,2] 

names_B = ['Mark', 'David', 'Michael', 'Brian'] 
data_B = [51,30,11,29] 

lookup_a = dict(zip(names_A, data_A)) 
lookup_b = dict(zip(names_B, data_B)) 

mapping = {value_a: lookup_b[key_a] for key_a, value_a in lookup_a.items()} 

Теперь ключи в mapping будут числа от data_A с соответствующими значениями из data_B.

Я никогда не работал с numpy, но теперь это простая задача сделать замену.


Просто чтобы дать пример с простым списком:

data = [4, 4, 3, 3, 2, 2, 1, 1, 3, 3] 
data = [mapping[value] for value in data] 

data теперь [30, 30, 51, 51, 11, 11, 29, 29, 51, 51].


Edited после установки NumPy

Если вы создали словарь отображения вы можете сделать следующее:

data = np.array([[4, 4, 3, 3, 2, 2, 1, 1, 3, 3], 
       [4, 3, 3, 3, 2, 2, 3, 1, 3, 1], 
       [4, 2, 3, 3, 2, 2, 4, 1, 4, 3]]) 

for row in data: 
    for index, value in enumerate(row): 
     row[index] = mapping[value] 

data Сейчас:

[[32 30 51 51 11 11 29 29 51 51] 
[30 51 51 51 11 11 51 29 51 29] 
[30 11 51 51 11 11 30 29 30 51]] 

Как я никогда работал с numpy до t здесь может быть проще (или более pythonic) решений, но по крайней мере это делает то, что он должен делать.

+0

Да, его хорошее решение, однако, я не очень знакомый со словарем, особенно с картографированием, которую вы создали. Так что вы можете проверить мой код в моем отредактированном вопросе, хотя я уже принял ваше решение. – jean

+0

Как я уже сказал, я не знаю 'numpy', но ваше решение выглядит странно (aka _wrong_). Если вы не знаете, что словарь заглянул в [tutorial] (https://docs.python.org/3/tutorial/datastructures.html#dictionaries). Это одна из базовых структур данных, которые должен знать каждый программист на Python. - Сейчас я AFK, но позже я смогу установить numpy и покажу вам подробности, если на этот вопрос никто не ответит. – Matthias

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