Использование Python модулей в Swift и Pythonkit - PullRequest
1 голос
/ 29 апреля 2020

Я искал помощи или разъяснений относительно ограничений использования PythonKit в Swift. Ну, я говорю PythonKit, я фактически установил набор инструментов Tensorflow в XCode, так как я не мог заставить Pythonkit работать самостоятельно как отдельная зависимость (MacBook вращал бы свои колёсики, пытаясь импортировать numpy).

В любом случае, я хотел бы сказать, что я могу использовать Python модули в Swift, что значительно упрощает возможность начать использовать swift для более чем iOS приложений.

Моя проблема в том, что у меня есть Импортированные Python модули в порядке, но не ясно, сколько они будут иметь. Я предполагаю, что такие как numpy будут в значительной степени такими же, но как ученый я часто использую файлы netcdf, поэтому я пытался использовать netCDF4. Это хорошо импортирует, и я могу загрузить объект данных и атрибуты и т.д. c хорошо, но я не могу получить фактический массив.

Вот пример:

import PythonKit
PythonLibrary.useVersion(3, 7)

let nc = Python.import("netCDF4")

var Data = nc.Dataset("ncfile path")
var lat_z = Data.variables["lat_z"][:]

The [ :] вызывает ошибку, которая обнаруживается XCode, удаление ее позволяет скрипту запускаться, но приводит к объекту переменной, а не к массиву. Я могу добавить вещи в конец, чтобы получить атрибуты et c, например, lat_z.long_name, но не уверен, как извлечь массив без использования [:]

Я надеюсь, что это просто синтаксическая разница, которую я Нужно учиться с Swift (очень рано с его использованием) или это ограничение PythonKit? Я не нашел никого, кто использовал netcdf4 (примеры, в основном, numpy и Matplotlib). Если да, есть ли какие-то общие ограничения при использовании модулей python в swift?

Я также пытаюсь заставить работать Matplotlib, но Я почти уверен, что это из-за использования проекта инструмента командной строки в XCode, который не имеет представления, поэтому имеет смысл, что он не может показать мне изображение.

Любые указатели и, возможно, ссылки на обновленную документацию были бы хорошими, похоже, произошли некоторые изменения, например, импорт PythonKit вместо импорта Python.

Большое спасибо

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете использовать свойство count для итераций python, эквивалентное len. Вы можете индексировать массив Numpy двумя способами, с синтаксисом Swift Range и с объектами диапазона Numpy:

import Foundation
import PythonKit

let np = Python.import("numpy")
let array = np.array([1, 2, 3, 4, 5])

print(array)  // [1, 2, 3, 4, 5]

let subArray = array[0..<array.count] 
print(subArray)  // [1, 2, 3, 4, 5]

let subArray2 = array[np.arange(0, 2)]
print(subArray2)  // [1, 2]

Вы также можете конвертировать массивы numpy в массивы Swift и использовать методы и индексы Swift:

let swiftArray = Array(array)
let swiftSubArray = swiftArray[0..<3]

print(swiftSubArray)  // [1, 2, 3]
...