在Swift和Pythonkit中使用Python模块

问题描述 投票:1回答:1

我希望得到一些帮助或澄清在Swift中使用PythonKit的限制。我说的是PythonKit,实际上我是在Xcode中安装了Tensorflow工具链,因为我无法让Pythonkit作为一个单一的依赖项独立工作(MacBook会用风扇轰击试图导入numpy来旋转它的轮子)。

无论如何,我想说的是,我可以在Swift中使用Python模块真是太棒了,这让我可以更容易地开始使用Swift,而不仅仅是iOS应用。

我的问题是,我导入的Python模块很好,但不清楚它们会有多少功能。我假设像numpy这样的模块也差不多,但是作为一个科学家,我经常使用netcdf文件,所以一直在尝试使用netCDF4。这个导入很好,我可以加载数据对象和属性等,但我不能得到实际的数组。

下面是一个例子。

import PythonKit
PythonLibrary.useVersion(3, 7)

let nc = Python.import("netCDF4")

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

[:]会导致Xcode接收到一个错误,移除它可以让脚本运行,但结果是变量对象而不是数组。我可以在结尾添加一些东西来获取属性等,例如lat_z.long_name,但不知道如何在不使用[:]的情况下提取数组。

我希望这只是我需要学习 swift 的语法差异 (使用 swift 还很早),还是 PythonKit 的一个限制?我没有发现有人在使用 netcdf4 (例子主要是 numpy 和 Matplotlib),如果是这样,在 swift 中使用 python 模块是否有一些普遍的限制?

我也在尝试让Matplotlib工作,但我很确定那是由于在Xcode中使用了一个命令行工具项目,而这个项目并没有得到一个视图,所以它不能给我看图像是有道理的。

任何指针和最新文档的链接都将是巨大的,似乎发生了一些变化,例如导入PythonKit而不是导入Python。

非常感谢

python swift tensorflow netcdf
1个回答
0
投票

你可以使用 count 属性,相当于在python迭代上的 len. 你可以用两种方式来索引Numpy数组,使用Swift Range语法和Numpy range对象。

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]
© www.soinside.com 2019 - 2024. All rights reserved.