首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将列表名称作为列表传递以在Python中创建numpy数组

将列表名称作为列表传递以在Python中创建numpy数组
EN

Stack Overflow用户
提问于 2020-04-25 22:39:01
回答 5查看 94关注 0票数 0

我有100个列表:

代码语言:javascript
复制
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]

我想创建一个100行4列的Numpy数组。我想知道是否有一种方法可以直接将列表的名称传递给Numpy数组函数?

我已经使用for循环创建了一个列表,然后存储:

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)

它不工作,有没有人知道这是否可能?

EN

回答 5

Stack Overflow用户

发布于 2020-04-25 22:45:29

您可以这样做:

代码语言:javascript
复制
np.array([eval('l' + str(i)) for i in range(100)])

或者如果你想使用你已经创建的list_of_names

代码语言:javascript
复制
np.array([eval(name) for name in list_of_names])

或者就像Vicrobot回答的那样

代码语言:javascript
复制
np.array(list(map(eval, list_of_names)))

都是等价的。

eval('var')返回变量var,有other (safer) ways可以做到这一点,但在这里可能没什么问题。[... for i in range(100)]是一个list comprehension,它的作用类似于一个创建列表的for循环。

但我必须指出:像这样命名100个单独的变量是非常糟糕的做法,使用小写l命名变量也是非常糟糕的做法。

票数 1
EN

Stack Overflow用户

发布于 2020-04-25 22:45:02

您可以将列表列表传递给np.array:

代码语言:javascript
复制
lol = [[1,2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
np.array(lol)

不过,看起来您的names_of_variables_in_a_list是一个字符串列表,而不是对列表变量的引用列表。您可以使用eval来获取实际的变量,而不是字符串表示:

代码语言:javascript
复制
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个不同的变量。在字典中,每个键是名称,值是列表,这可能会让您更容易做到这一点。

票数 0
EN

Stack Overflow用户

发布于 2020-04-25 22:48:13

要嵌入list的名称,最自然的方法是使用dictionary

代码语言:javascript
复制
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))

那么结果是

代码语言:javascript
复制
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]}

较短的字典理解:

代码语言:javascript
复制
d = {'l{:d}'.format(i): eval('l{:d}'.format(i)) for i in range(7)}

使用f-string时更短(python >= 3.6):

代码语言:javascript
复制
d = {f'l{i}': eval(f'l{i}') for i in range(7)}

如果您想创建numpy ndarray而不保留list的名称:

代码语言:javascript
复制
import numpy as np
array2d = np.array([eval('l{}'.format(i)) for i in range(7)])

那么结果是

代码语言:javascript
复制
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,:]是list i-th list。

使用f-string (python >= 3.6)的较短方法:

代码语言:javascript
复制
array2d = np.array([eval(f'l{i}') for i in range(7)])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61427359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档