我正在处理一个 Python 脚本,我想生成一个带有变量定义的字符串,这是一个 numpy 数组。我希望它将其写入外部文件或屏幕而不是打印/写入整个数组。
为了清楚起见,我有:
import numpy as np
normalization = np.arange(4, 11, 0.1)
我想获得:
normalization_string = 'np.arange(4, 11, 0.1)'
不必手动编写,但当然指定从变量 normalization
生成字符串。
有没有一种简单的方法来生成该字符串?
通常你不能,因为变量根本不知道(因为变量不在乎(它是如何创建的。
例如,在您的情况下,np.arange
只是一个函数。它返回一个np.ndarray
,但是有几种方法可以创建一个numpy.ndarray
:
>>> import numpy as np
>>> np.arange(4, 5, 0.1)
array([ 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9])
>>> np.arange(40, 50) / 10.
array([ 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9])
>>> np.array(range(40, 50, 1)) / 10.
array([ 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9])
>>> np.linspace(4, 4.9, 10)
array([ 4. , 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9])
它们都创建相同的数组。
我的建议:
只需保护在运行之间更改的参数,例如,如果要修改"步骤":
step = 0.1
arr = np.arange(4, 11, step)
# do something with arr
res = ... # the result
# safe only the "step" and "res".
print('np.arange(4, 11, {})'.format(step)) # creating a string
如果开始、停止和步长不同:
start = 4
stop = 11
step = 0.1
arr = np.arange(start, stop, step)
# do something with arr
res = ... # the result
# safe "start", "stop", "step" and "res".
print('np.arange({}, {}, {})'.format(start, stop, step)) # or create the string
我添加了print
主要是因为您明确要求字符串表示。
我想我找到了解决方法:
使用委托所有变量定义的特定类,如下所示:
class VariableConstructor():
def __init__(self):
self.idsTable = []
def construct_primitive(self, value):
x = value
self.idsTable.append( (id(x), type(value), str(value)) )
return x
def construct_object(self, constructor, args=None, kwargs=None):
if args is not None and kwargs is not None:
x = constructor(*args, **kwargs)
self.idsTable.append( (id(x), constructor, str(args) + ',' + str(kwargs)) )
elif args is not None:
x = constructor(*args)
self.idsTable.append( (id(x), constructor, str(args)) )
elif kwargs is not None:
self.idsTable.append( (id(x), constructor, str(kwargs)) )
x = constructor(**kwargs)
else:
x = constructor()
self.idsTable.append( (id(x), constructor, '') )
return x
def get_string_representation(self, variable):
_, t, args = filter(lambda x: x[0] == id(variable), self.idsTable)[0]
return str(t).replace('<','').replace('>','')+':'+args
然后,这是一些示例代码:
import numpy as np
vc = VariableConstructor()
i = vc.construct_primitive(5)
f = vc.construct_primitive(10.)
l = vc.construct_object(list)
arr = vc.construct_object(np.arange, (4,11,0.1))
print(vc.get_string_representation(i))
print(vc.get_string_representation(f))
print(vc.get_string_representation(l))
print(vc.get_string_representation(arr))
这将输出:
type 'int':5
type 'float':10.0
type 'list':
built-in function arange:(4, 11, 0.1)
一些注意事项:
- 这是一个示例代码,错误可能潜伏在任何地方。
- 您可以轻松更改变量字符串在方法中get_string_representation()
方式。
- 您的代码可能难以从其他人那里读取。
编辑:我误读了你所说的,并认为你想要任何变量的一般方法。没有看到它只是为了np.arange
对象。这是矫枉过正。(适当的答案在评论中(
但是,我想我会在这里留下我的答案,因为它回答了问题的标题。