代码之家  ›  专栏  ›  技术社区  ›  markroxor

将numpy与swift throws一起使用时,“不能用参数”error调用“*”

  •  0
  • markroxor  · 技术社区  · 5 年前

    我计划在swift中使用python的numpy,因为我需要使用swift进行数学计算。

    import Python
    let np = Python.import("numpy")
    let x = np.zeros(shape:(1, 2))
    

    抛出错误

    error: <Cell 3>:2:17: error: cannot call value of non-function type 'PythonObject'
    let x = np.zeros(shape:(1, 2))
            ~~~~~~~~^
    
    error: <Cell 3>:2:12: error: cannot invoke 'zeros' with an argument list of type '(shape: (Int, Int))'
    let x = np.zeros(shape:(1, 2))
               ^
    

    Swift cannot invoke '*' with an argument list of type '(Int, Int)' 但我认为它们与努比无关。

    我最近开始学斯威夫特,所以很有可能我在问一些非常基本的问题。

    4 回复  |  直到 5 年前
        1
  •  1
  •   nighmared    5 年前

    可能是你没有正确地调用0吗?

    Numpy 你好像在错误地调用上述方法

    编辑:我的建议是不正确的,但似乎错误在于语法,请看 this

    TLDR公司 在底部)
    编辑3:我下面的结论似乎是错误的解决方案见下面@markroxor的回答。但是()和[]之间的区别仍然存在,因此我将保持该段落的原样。

    我其实对斯威夫特不太熟悉,所以我不能向你保证我说的每一句话都是正确的,但我要说的是。 x = [a,b,c] 将创建类型为list的对象,而 x = (a,b,c) 将创建元组。它们都用于存储可通过x[索引]访问的多个元素。它们之间最重要的区别是,一个列表在创建后可以修改( x[0] = z 然而,这并不适用于Swift(与我最初的想法相反)

    现在,看到python在不尝试使用“非法”参数类型的情况下如何大大忽略参数类型,我认为很可能 numpy.zeros()

    在查找了Swift语法之后,我想说问题/解决方案是,虽然Swift和Python似乎处理列表/数组(Python调用它们列表)非常类似,但是元组的语法差别很大,导致方法调用在使用圆括号时抛出错误,从而创建 python不知道如何处理的元组,而数组/列表工作方式的相似性导致将[]成功传递给numpy方法

    TLDR公司

        2
  •  0
  •   Nat    5 年前

    错误是告诉你你要调用的不是函数。

    尝试使用 .call(with:)

    let x = np.zeros.call(with: 15).shape.call(with: 1, 2)
    

    或者你想用什么功能,我不熟悉 numpty 但我也用过类似的方法 .call 在一些python模块上,因为它还不是一个间接函数。

        3
  •  0
  •   markroxor    5 年前

    正确的语法是-

    import Python
    let np = Python.import("numpy")
    let x = np.zeros(shape:[1, 2])
    

    let a = [1,2]
    let b = (1, 2)
    print(type(of: a),type(of: b))
    

    产量

    Array<Int> (Int, Int)
    

    np.zeros np.some_function Array 作为输入参数。因此需要方括号。

        4
  •  0
  •   Saman PourFalatoon    5 年前

    cannot call the value of a non-function type 'PythonObject' . 通过修复闭包中的错误,它将编译。

    纽比零 形状 内景 整数元组 ,因此您只需将代码更改为:

    let x = np.zeros((1, 2))
    

    另外,如果需要“数组数组”,则可以使用以下语法:

    var matrix = Array(count: 1, repeatedValue: Array(count: 2, repeatedValue: 0.0))