【问题标题】:Perform operation on python list without using global variables在不使用全局变量的情况下对 python 列表执行操作
【发布时间】:2019-05-31 15:49:21
【问题描述】:

我有一个 python 列表(例如lst = [2, 3, 5])。对应lst 的每个元素,我想用以下方式构造一个numpy 矩阵:它应该是一个与lst 的考虑元素大小相同的方阵,并且应该用它的平方值填充元素。

这就是我目前处理问题的方式:

import numpy as np
lst = [2,3,5]
for i in range(len(lst)):
    globals()['mat'+str(lst[i])] = np.full( (lst[i],lst[i]), lst[i]**2 )

print globals()['mat'+str(2)]
print " "
print globals()['mat'+str(3)]
print " "
print globals()['mat'+str(5)]    

[[4 4]
 [4 4]]

[[9 9 9]
 [9 9 9]
 [9 9 9]]

[[25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]]

在不使用全局变量的情况下执行此任务的有效方法是什么?

【问题讨论】:

    标签: python python-2.7 list numpy numpy-ndarray


    【解决方案1】:

    无论您如何命名或生成数组,这里都不存在效率问题。无论命名如何,您都必须为每个数组使用np.full。创建数组后,您可以将其收集到列表、字典中或将其分配给变量。

    我会将数组收集到一个列表中:

    In [212]: lst = [2,3,5]
    In [213]: lst1 = [np.full((i,i),i**2) for i in lst]
    In [214]: lst1
    Out[214]: 
    [array([[4, 4],
            [4, 4]]), array([[9, 9, 9],
            [9, 9, 9],
            [9, 9, 9]]), array([[25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25]])]
    

    如果您必须指定名称,请使用以下内容:

    In [215]: mat2, mat3, mat5 = lst1
    In [216]: mat3
    Out[216]: 
    array([[9, 9, 9],
           [9, 9, 9],
           [9, 9, 9]])
    

    globals()[] 技巧有效,但不是好的 Python 编程习惯。它看起来更像是 BASIC 世界的继承,而不是惯用的 Python。收集列表和字典中的内容,而不是动态生成的全局变量。

    说到字典,我们可以将列表转换为一个:

    In [217]: adict = {f'mat{i}': x for i,x in zip(lst, lst1)}
    In [218]: adict
    Out[218]: 
    {'mat2': array([[4, 4],
            [4, 4]]), 'mat3': array([[9, 9, 9],
            [9, 9, 9],
            [9, 9, 9]]), 'mat5': array([[25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25],
            [25, 25, 25, 25, 25]])}
    

    (这里我使用的是新的f-literal 字符串语法。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多