通过名称访问元组中的变量

1 投票
4 回答
1970 浏览
提问于 2025-04-16 03:51

我需要根据变量的名字来访问这些变量,方法如下:

a = numpy.array([1,2,3])
b = numpy.array([4,5,6])
names = ('a', 'b')

然后,我把变量 names 传给一个函数,比如 numpy.hstack(),这样就能得到和 numpy.hstack((a,b)) 一样的结果。

那么,最好的 Python 方法是什么呢?

这样做的目的是什么呢?我有一个函数,它接受 numpy 数组的名字,然后把相关的数组(在函数里定义的)堆叠在一起进行处理。我需要创建这些数组的所有可能组合,因此:

  1. 创建一个数组名字的组合(元组)。
  2. 把这个组合(元组)作为参数传给一个函数。
  3. 这个函数把相关的数组连接起来,并处理结果。

希望这个问题不是太难懂。提前感谢大家的回答 :-)

4 个回答

2

既然你在使用numpy,并且想通过名字来引用数组,那么你可能应该使用一个叫做recarray的东西:

import numpy as np
import itertools as it

a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
names=('a','b','c')
arr=np.rec.fromarrays([a,b,c],names=names)

一旦你定义了这个recarray arr,你就可以通过名字来访问每一列:

In [57]: arr['a']
Out[57]: array([1, 2, 3])

In [58]: arr['c']
Out[58]: array([7, 8, 9])

所以,如果你想生成名字的组合,并用np.hstack把这些列合并起来,你可以这样做:

for comb in it.combinations(names,2):
    print(np.hstack(arr[c] for c in comb))
# [1 2 3 4 5 6]
# [1 2 3 7 8 9]
# [4 5 6 7 8 9]
2

如果我理解你的问题没错的话,你需要像这样使用 locals()

def lookup(dic, names):
  return tuple(dic[name] for name in names)

...
a = numpy.array([1,2,3])
b = numpy.array([4,5,6])
names = ('a', 'b')
numpy.hstack(lookup(locals(), names))
2

你可以使用内置的函数 locals,这个函数会返回一个字典,里面包含了当前作用域内的所有变量和它们的值:

>>> a = 1
>>> locals()['a']
1

>>> a = 1; b = 2; c = 3
>>> [locals()[x] for x in ('a','b','c')]
[1, 2, 3]

你也可以把你的数组直接放在自己的字典里,或者放在一个模块中。

撰写回答