Передача имен списков в виде списка для создания массива numpy в Python - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть 100 списков:

l0 = [35.467, 1785387, 9984670,  0.913]
l1 = [63.951, 2833687, 640679,  0.888]
l2 = [80.940, 3874437, 357114,  0.916]
l3 = [60.665, 2167744, 301336,  0.873]
l4 = [127.061, 4602367, 377930,  0.891]
l5 = [64.511, 2950039, 242495,  0.907]
l6 = [318.523, 17348075, 9525067,  0.915]

Я хочу создать его как массив Numpy из 100 строк и 4 столбцов. Мне интересно, есть ли способ передать имена списка в функцию массива Numpy напрямую?

Я использовал for l oop, чтобы создать список, который затем хранит:
names_of_variables_in_a_list = ['l0,', 'l1,', 'l2,', 'l3,', 'l4,', 'l5,', 'l6,'....,'l99','l100']

Но когда я пытаюсь передать это как:
Employee_data = np.array(names_of_variables_in_a_list).
Это не работает, кто-нибудь может знать, возможно ли это?

Ответы [ 5 ]

1 голос
/ 25 апреля 2020

Вы можете сделать это как

np.array([eval('l' + str(i)) for i in range(100)])

или если вы хотите использовать list_of_names, который вы уже создали,

np.array([eval(name) for name in list_of_names])

или, как ответил Vicrobot,

np.array(list(map(eval, list_of_names)))

Весь эквивалент.

eval('var') возвращает переменную var, и есть другие (более безопасные) способы , чтобы сделать это, но, вероятно, здесь все в порядке. [... for i in range(100)] - это понимание списка , которое действует как for-l oop для создания списка.

Но я должен упомянуть: очень плохо называть 100 отдельных такие переменные, а также очень плохая практика именовать переменные, используя строчные буквы l.

0 голосов
/ 25 апреля 2020

Как вы получаете эти списки? Загрузить из файла? copy-n-paste?

Если копировать-n-вставить ваш образец в ipython сеанс, я могу получить список списков с:

In [866]: alist = [globals()[f'l{i}'] for i in range(0,6)]                                             
In [867]: alist                                                                                        
Out[867]: 
[[35.467, 1785387, 9984670, 0.913],
 [63.951, 2833687, 640679, 0.888],
 [80.94, 3874437, 357114, 0.916],
 [60.665, 2167744, 301336, 0.873],
 [127.061, 4602367, 377930, 0.891],
 [64.511, 2950039, 242495, 0.907]]
In [868]: np.array(alist)                                                                              
Out[868]: 
array([[3.546700e+01, 1.785387e+06, 9.984670e+06, 9.130000e-01],
       [6.395100e+01, 2.833687e+06, 6.406790e+05, 8.880000e-01],
       [8.094000e+01, 3.874437e+06, 3.571140e+05, 9.160000e-01],
       [6.066500e+01, 2.167744e+06, 3.013360e+05, 8.730000e-01],
       [1.270610e+02, 4.602367e+06, 3.779300e+05, 8.910000e-01],
       [6.451100e+01, 2.950039e+06, 2.424950e+05, 9.070000e-01]])

globals() является словарь всех переменных, определенных в данный момент в сессии.

In [869]: globals()['l1']                                                                              
Out[869]: [63.951, 2833687, 640679, 0.888]

Использование globals подобно этому аналогично использованию exec

Предоставление длинного списка переменных, подобных этому, не подходит Python. Лучше предоставить список списков напрямую. Если бы источник пошел на всю работу ввода:

l0 = ...
11 = ...

они могли бы также предоставить alist = [l0, l1, ...] или ввести список списков, как я показываю в [876]

0 голосов
/ 25 апреля 2020

Чтобы встроить имя списка, естественным способом было бы использовать словарь :

l0 = [35.467, 1785387, 9984670, 0.913]
l1 = [63.951, 2833687, 640679, 0.888]
l2 = [80.940, 3874437, 357114, 0.916]
l3 = [60.665, 2167744, 301336, 0.873]
l4 = [127.061, 4602367, 377930, 0.891]
l5 = [64.511, 2950039, 242495, 0.907]
l6 = [318.523, 17348075, 9525067, 0.915]

d = {}
for i in range(7):
    d['l{:d}'.format(i)] = eval('l{:d}'.format(i))

, тогда результат будет

In [2]: d
Out[2]:
{'l0': [35.467, 1785387, 9984670, 0.913],
 'l1': [63.951, 2833687, 640679, 0.888],
 'l2': [80.94, 3874437, 357114, 0.916],
 'l3': [60.665, 2167744, 301336, 0.873],
 'l4': [127.061, 4602367, 377930, 0.891],
 'l5': [64.511, 2950039, 242495, 0.907],
 'l6': [318.523, 17348075, 9525067, 0.915]}

Короче со словарем понимание:

d = {'l{:d}'.format(i): eval('l{:d}'.format(i)) for i in range(7)}

и даже короче с f-строкой (python> = 3.6):

d = {f'l{i}': eval(f'l{i}') for i in range(7)}

Если вы хотите создать numpy ndarray без сохранения названия списка:

import numpy as np
array2d = np.array([eval('l{}'.format(i)) for i in range(7)])

, тогда результат будет

In [4]: array2d
Out[4]:
array([[3.5467000e+01, 1.7853870e+06, 9.9846700e+06, 9.1300000e-01],
       [6.3951000e+01, 2.8336870e+06, 6.4067900e+05, 8.8800000e-01],
       [8.0940000e+01, 3.8744370e+06, 3.5711400e+05, 9.1600000e-01],
       [6.0665000e+01, 2.1677440e+06, 3.0133600e+05, 8.7300000e-01],
       [1.2706100e+02, 4.6023670e+06, 3.7793000e+05, 8.9100000e-01],
       [6.4511000e+01, 2.9500390e+06, 2.4249500e+05, 9.0700000e-01],
       [3.1852300e+02, 1.7348075e+07, 9.5250670e+06, 9.1500000e-01]])

, где array2d[i,:] - список i -й список.
И более короткий путь с f-строкой (python> = 3.6):

array2d = np.array([eval(f'l{i}') for i in range(7)])
0 голосов
/ 25 апреля 2020

Вы можете использовать функцию eval:

>>> l0=[1,2,3]
>>> l1=[2,4,6]
>>> np.asarray(list(map(eval, ['l0','l1'])))
array([[1, 2, 3],
       [2, 4, 6]])
0 голосов
/ 25 апреля 2020

Вы можете передать список списков в np.array:

lol = [[1,2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
np.array(lol)

Похоже, ваш names_of_variables_in_a_list представляет собой список строк, а не список ссылок на переменные списка. Вы можете использовать eval, чтобы получить фактическую переменную вместо строкового представления:

names_of_variables_in_a_list = eval("l"+str(i)) for i in range(1, 100)]
np.array(names_of_variables_in_a_list)

, хотя eval действительно не рекомендуется и не рекомендуется. Вам лучше пересмотреть эти 100 различных переменных. Дикт, где каждый ключ - это имя, а значение - список, может сделать это проще для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...