我希望得到一些帮助或澄清在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。
非常感谢
你可以使用 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]