Использование numpy с быстрыми бросками "не может вызвать '*' с аргументом" ошибка - PullRequest
0 голосов
/ 19 января 2020

Я планирую использовать 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 не может вызвать '*' со списком аргументов типа '(Int, Int ) ', но я не думаю, что они имеют отношение к numpy.

PS - я недавно начал учиться быстрому, поэтому очень возможно, что я спрашиваю что-то очень основательное c .

Ответы [ 4 ]

1 голос
/ 19 января 2020

Может быть, вы не правильно называете нули?

Если вам нужна матрица 2x2, вы можете взглянуть на документы для Numpy как кажется, что вы ошибочно вызываете указанный метод

Редактировать: мое предложение было неверным, но все же кажется, что ошибка заключается в синтаксисе, взгляните на this

Edit2: в соответствии с вашим комментарием, здесь некоторые объяснения. ( TLDR внизу)
Edit3: Мой вывод, приведенный ниже, кажется неверным для решения, см. Ответ @markroxor ниже. Однако разница между () и [] сохраняется, поэтому я оставлю абзац без изменений.

На самом деле я не слишком знаком со swift, поэтому не могу заверить вас, что все Я говорю правильно, но здесь идет. Я просто предположил, что аргументы передаются в python так, как они вводятся в вызов метода. Теперь в Python x = [a,b,c] будет создан объект типа list, тогда как x = (a,b,c) создаст кортеж. Они оба используются для хранения нескольких элементов, к которым можно получить доступ через x [index]. Самое важное различие между ними заключается в том, что список может быть изменен после его создания (x[0] = z), а попытка сделать это для кортежа приведет к ошибке. Однако это не относится к Swift (вопреки тому, что я думал вначале)

Теперь посмотрим, как python сильно игнорирует типы параметров, если с ними не предпринимается никаких «незаконных» попыток Я подумал, что вполне вероятно, что numpy.zeros() не будет заботиться, если ему передан список или кортеж, если он содержит целые числа (проверено, ошибок нет). Опять же, это применимо для использования только в python

Теперь, посмотрев синтаксис Swift, я бы сказал, что проблема / решение в том, что Swift и Python, похоже, обрабатывают списки / массивы (Python вызовы их списки) очень похоже синтаксис кортежей сильно отличается, в результате чего вызов метода выдает ошибку при использовании круглых скобок, создавая тем самым Swift кортеж, который python не знает, как обрабатывать, тогда как Сходство в том, как работают массивы / списки, приводит к тому, что [] успешно передается в метод numpy

TLDR Разница, по-видимому, в том, что Python и Swift обрабатывают массивы аналогично, реализация Tuples отличается, поэтому использование [] работает над ()

0 голосов
/ 19 января 2020

Правильный синтаксис: -

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)

Swift жесток с синтаксисом в отличие от python, где круглые и квадратные скобки могут использоваться взаимозаменяемо при передаче функции в большинстве случаев. np.zeros или np.some_function принимает Array в качестве входного аргумента. Отсюда необходимость в квадратных скобках.

0 голосов
/ 19 января 2020

когда в теле замыкания есть ошибка, компилятор сообщит, что оно cannot call the value of a non-function type 'PythonObject'. Исправив ошибку в замыкании, он скомпилирует.

в numpy .zeros shape - это параметр int или кортеж из целых чисел , поэтому вам просто нужно изменить код на:

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

также, если вам нужен «массив массивов», вы можете использовать следующий синтаксис:

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

Это создает матрицу из нулей 1 x 2.

0 голосов
/ 19 января 2020

Ошибка говорит вам, что все, что вы пытаетесь вызвать, не является функцией.

Попробуйте вместо этого использовать .call(with:), поэтому:

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

или в любой другой функции вы хотите использовать, я не знаком с numpty, но я использовал нечто подобное и должен был сделать это таким же образом с .call на некоторых python модулях, поскольку это не косвенная функция - пока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...