numpy数组的参数分析器

2024-04-19 23:19:05 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以为np.数组而不是单子? 我知道我能做这样的事

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)

但是我想在解析之前指定参数的完整描述。在

有办法吗?在


Tags: 方法importaddparserfoonpargparseargs
2条回答

要在StoreAction操作处理程序的工作方式中指定一个细微的更改,您可以创建一个具有适当更改的处理程序的subclass(文档在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)

正如我在评论中指出的,“在解析之前完成描述”并不清楚。在

但是我突然想到可以用argparse创建一个2d数组。我可以使用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实际上不是用来输入大量值的。它不是一个通用的文件解析器。命令行控制代码的行为。在

相关问题 更多 >