Python 可以将字符串更改为变量吗?

Python 可以将字符串更改为变量吗?,python,numpy,Python,Numpy,对于每个结果,我想将np.nan值转换为-9.0: import numpy as np data1 = np.array([1,2,np.nan,4,5,6,7],dtype=float) data2 = np.array([11,np.nan,9,4,5,6,71],dtype=float) data3 = np.array([17,np.nan,13,4,15,6,17],dtype=float) result1 = data1/data2 result2 = data1/data3

对于每个结果,我想将np.nan值转换为-9.0:

import numpy as np

data1 = np.array([1,2,np.nan,4,5,6,7],dtype=float)
data2 = np.array([11,np.nan,9,4,5,6,71],dtype=float)
data3 = np.array([17,np.nan,13,4,15,6,17],dtype=float)


result1 = data1/data2
result2 = data1/data3
result3 = data3/data2
但在我真正的问题中,我有数百个结果数组(result1、result2……result100)。因此,我不能像上面那样手动操作。因此,将他们分为以下几组:

result1 = np.where(np.isnan(result1),-9.0,result1)
result2 = np.where(np.isnan(result2),-9.0,result2)
result3 = np.where(np.isnan(result3),-9.0,result3)
如何将字符串(my_组的元素)更改为其相应的变量

my_groups = ['result1', 'result2', 'result3']

等待解决问题的良好实践。

您可以使用字典为这些“变量”赋值:

for i in my_groups:
    out[i] = np.where(np.isnan(i),-9.0,i)
回答你的问题:

>>> string = 'result1'
>>> myobj = {}
>>> myobj[string] = 45
>>> myobj['result1']
45
>>> 

若要在模块范围内的变量上迭代,可以使用globals(),它包含模块中的所有变量。globals()返回结构为:{“var_name”:var,…}的字典,即:

>>> array = ['result1', 'result2', 'result3', 'result4', 'result5', 'result6', 'result7', 'result8', 'result9', 'result10']
>>> myobj = {}
>>> values = [5, 2, 87, 56, 23, 5, 99, 2, 24, 15]                                                                       >>> for k in range(len(array)):
...     myobj[array[k]] = values[k]
... 
>>> myobj['result2']
2
>>> myobj['result6']
5
>>> myobj['result7']
99
>>> 
在“服务”模块变量中,我们的
x
y
将存在:

x = 10
y = 10

print globals()
至于你的例子:

{"x": 10, "y": 10, ...}
建议:

import numpy as np

data1 = np.array([1,2,np.nan,4,5,6,7],dtype=float)
data2 = np.array([11,np.nan,9,4,5,6,71],dtype=float)
data3 = np.array([17,np.nan,13,4,15,6,17],dtype=float)

result1 = data1/data2
result2 = data1/data3
result3 = data3/data2
结果是:

# It necessary to convert globals().keys() to list otherwise 
# exception will be raised that we change dictionary (owner new variable var_name)
# during iterations.
for var_name in list(globals().keys()):
    if var_name.startswith("result"):
        value = globals()[var_name]
        globals()[var_name] = np.where(np.isnan(value),-9.0,value)

print result1
print result2
print result3
更新


但我应该注意到,最佳实践将首先对您的
result1
result2
<代码>结果100。。。将变量放入集合(我认为最合适的是列表),然后对其进行迭代。如果您已经有一个包含这些定义变量的大型Python文件(
resultX
),那么上面的建议可能“不错”

像这样重写整个代码

[ 0.09090909 -9.         -9.          1.          1.          1.
  0.09859155]
[ 0.05882353 -9.         -9.          1.          0.33333333  1.
  0.41176471]
[ 1.54545455 -9.          1.44444444  1.          3.          1.
  0.23943662]
所以。。。 全部替换

data = np.empty(shape=(3, 7), dtype=float)
result = np.empty(shape=(3, 7), dtype=float)

data[0] = np.array([1,2,np.nan,4,5,6,7],dtype=float)
data[1] = np.array([11,np.nan,9,4,5,6,71],dtype=float)
data[2] = np.array([17,np.nan,13,4,15,6,17],dtype=float)

result[0] = data[0]/data[1]
result[1] = data[0]/data[2]
result[2] = data[2]/data[1]

result = np.where(np.isnan(result),-9.0,result)

下面是替换所有这些的代码

data[0], data[1], data[2],,,data[99]
result[0], result[1], result[2],,,result[99]

解决它是一种糟糕的做法。你可以从一开始就表现出良好的做法。但是百个结果数组不变。停止使用裸名称。首先将数组放在列表中。很抱歉,在获得result1、result2…result100之后,我需要解决方案。首先要正确处理。你的“真实”问题不是一个好问题。aj8uppal的答案(在附加组件之前)是一个很好的答案。是的,但我只是发布了附加组件的多样性。不要使用
exec
如果你不知道它能做什么,@lejlot,我删除了令人不快的答案:)
data[0], data[1], data[2],,,data[99]
result[0], result[1], result[2],,,result[99]
source_code = '''
Paste your source code here...
'''

import re

def replace_data_num(r):
    return "data[" + str(int(r.group(1)) - 1) + "]"

def replace_result_num(r):
    return "result[" + str(int(r.group(1)) - 1) + "]"

source_code = re.sub(r'data(\d+)', replace_data_num, source_code)
source_code = re.sub(r'result(\d+)', replace_result_num, source_code)
print source_code