【问题标题】:Can I pass a matrix as command line input in python with numpy?我可以使用 numpy 在 python 中将矩阵作为命令行输入传递吗?
【发布时间】:2015-03-04 09:40:08
【问题描述】:

我正在开发一个简单的程序,使用 numpy. 现在,我所能做的就是改变程序中的一和零:-

seed = np.array([[0,0,0,0],[0,1,1,0],[0,1,1,1],[0,0,0,0]])  
print(nextStep(seed))

但我希望能够在命令行中传递初始数组。有什么办法可以做到这一点?

【问题讨论】:

    标签: python numpy multidimensional-array command-line-arguments


    【解决方案1】:

    您想要的基本上是将文本转换为结构化数据(此处为 numpy 数组)。因为手动操作(例如拆分字符串或使用eval)充满了错误和安全漏洞,所以我建议使用为您进行解析的库。

    这里我认为json 是最自然的格式。示例用法

    import json
    import numpy
    import sys
    
    data = numpy.array(json.loads(sys.argv[1]))
    # do you calculation
    

    现在可以在命令行运行了

    python myscript.py '[[0,0,0,0],[0,1,1,0],[0,1,1,1],[0,0,0,0]]'
    

    【讨论】:

      【解决方案2】:

      eval 可以做到这一点:

      python myprogram.py "[[0,0,0,0],[0,1,1,0],[0,1,1,1],[0,0,0,0]]"
      

      python 代码:

      import sys
      
      ...
      ...
      
      seed = np.array(eval(sys.argv[1]))
      

      【讨论】:

      • 谢谢。我可以通过这种方式在命令行中输入数组,但现在的输出正是我作为输入传递的内容!
      • ideone.com/625Pr5 告诉你,在调用“eval”之后,作为输入传递的字符串现在是列表。正是你传递给 np.array 函数。
      • 出于安全原因,我建议不要在纯 sys.argv 数据上运行 eval
      • 当然,在运行 eval 之前必须检查数据,但这不是这个线程的主题
      【解决方案3】:

      如果你想写

      $ python life.py 0101010,0101010,0101010
      

      那么你需要来自sys 模块的argv 向量,它包含命令行中的所有元素,然后是一个简单的列表理解 用逗号分割第一个参数,因此矩阵的rows(请注意,这些行是字符串),然后构建一个子列表来转换一行中的每个字符

      from sys import argv
      ...
      life = np.array([[int(c) for c in r] for r in argv[1].split(',')])
      

      为了详细显示过程,使用辅助变量代替argv[1]

      In [46]: m = '0101010,0101010,0101010'
      
      In [47]: [r for r in m.split(',')]
      Out[47]: ['0101010', '0101010', '0101010']
      
      In [48]: [[c for c in r] for r in m.split(',')]
      Out[48]: 
      [['0', '1', '0', '1', '0', '1', '0'],
       ['0', '1', '0', '1', '0', '1', '0'],
       ['0', '1', '0', '1', '0', '1', '0']]
      
      In [49]: [[int(c) for c in r] for r in m.split(',')]
      Out[49]: [[0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0]]
      
      In [50]: np.array([[int(c) for c in r] for r in m.split(',')])
      Out[50]: 
      array([[0, 1, 0, 1, 0, 1, 0],
             [0, 1, 0, 1, 0, 1, 0],
             [0, 1, 0, 1, 0, 1, 0]])
      
      In [51]: 
      

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多