numpy 数组的 ArgumentParser
ArgumentParser for numpy array
有没有办法为 np.array 而不是列表向 ArgumentParser 添加参数?
我知道我可以做这样的事情
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-foo', action='store', type=int, nargs='+')
args = parser.parse_args(['-foo', '1', '2'])
args.foo = np.array(args.foo)
但我想在解析之前指定参数的完整描述。
有办法吗?
要指定 StoreAction
操作处理程序的工作方式的细微变化,您将创建一个 subclass of the handler with appropriate change (the docs have an example right above this section)
import argparse, numpy as np
class Store_as_array(argparse._StoreAction):
def __call__(self, parser, namespace, values, option_string=None):
values = np.array(values)
return super().__call__(parser, namespace, values, option_string)
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-foo', action=Store_as_array, type=int, nargs='+')
# ^ specify as the action
args = parser.parse_args(['-foo', '1', '2'])
assert isinstance(args.foo, np.ndarray)
如我的评论所述,'complete description before parsing' 不清楚。
但我突然想到可以用 argparse
创建一个二维数组。我可以使用 nargs=3
指定 3 列,并使用 action='append'
将输入收集到多个子列表中。当然 type
指定它是 int 还是 float。
In [27]: p=argparse.ArgumentParser()
In [28]: p.add_argument('-a',action='append',nargs='+',type=int)
Out[28]: _AppendAction(option_strings=['-a'], dest='a', nargs='+', const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
In [29]: args=p.parse_args('-a 1 2 3 -a 4 5 6 -a 7 8 9'.split())
In [30]: args
Out[30]: Namespace(a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [31]: np.array(args.a)
Out[31]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
如果我没有正确的列数,它会抱怨。它无法控制的只是行数;但我可以在创建后轻松检查数组的形状。
有了这个 append
,在 action
中创建数组就没有意义了。即使使用 1d 输入,在解析期间执行 np.array
调用也没有太大优势。在解析后按摩(和测试)args
值是非常好的做法。
最好将数组值放在 CSV 文件中,并通过 argparse
指定该文件的名称。 argparse
确实不适合输入大量值。它不是通用文件解析器。命令行控制代码的行为。
有没有办法为 np.array 而不是列表向 ArgumentParser 添加参数? 我知道我可以做这样的事情
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-foo', action='store', type=int, nargs='+')
args = parser.parse_args(['-foo', '1', '2'])
args.foo = np.array(args.foo)
但我想在解析之前指定参数的完整描述。
有办法吗?
要指定 StoreAction
操作处理程序的工作方式的细微变化,您将创建一个 subclass of the handler with appropriate change (the docs have an example right above this section)
import argparse, numpy as np
class Store_as_array(argparse._StoreAction):
def __call__(self, parser, namespace, values, option_string=None):
values = np.array(values)
return super().__call__(parser, namespace, values, option_string)
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-foo', action=Store_as_array, type=int, nargs='+')
# ^ specify as the action
args = parser.parse_args(['-foo', '1', '2'])
assert isinstance(args.foo, np.ndarray)
如我的评论所述,'complete description before parsing' 不清楚。
但我突然想到可以用 argparse
创建一个二维数组。我可以使用 nargs=3
指定 3 列,并使用 action='append'
将输入收集到多个子列表中。当然 type
指定它是 int 还是 float。
In [27]: p=argparse.ArgumentParser()
In [28]: p.add_argument('-a',action='append',nargs='+',type=int)
Out[28]: _AppendAction(option_strings=['-a'], dest='a', nargs='+', const=None, default=None, type=<class 'int'>, choices=None, help=None, metavar=None)
In [29]: args=p.parse_args('-a 1 2 3 -a 4 5 6 -a 7 8 9'.split())
In [30]: args
Out[30]: Namespace(a=[[1, 2, 3], [4, 5, 6], [7, 8, 9]])
In [31]: np.array(args.a)
Out[31]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
如果我没有正确的列数,它会抱怨。它无法控制的只是行数;但我可以在创建后轻松检查数组的形状。
有了这个 append
,在 action
中创建数组就没有意义了。即使使用 1d 输入,在解析期间执行 np.array
调用也没有太大优势。在解析后按摩(和测试)args
值是非常好的做法。
最好将数组值放在 CSV 文件中,并通过 argparse
指定该文件的名称。 argparse
确实不适合输入大量值。它不是通用文件解析器。命令行控制代码的行为。