Swift For TensorFlow, Python'un birlikte çalışabilirliğini destekler.
Python modüllerini Swift'den içe aktarabilir, Python işlevlerini çağırabilir ve değerleri Swift ile Python arasında dönüştürebilirsiniz.
import PythonKit
print(Python.version)
3.6.9 (default, Oct 8 2020, 12:12:24) [GCC 8.4.0]
Python sürümünü ayarlama
Varsayılan olarak, import Python
Swift, kurulu Python'un en yeni sürümü için sistem kitaplığı yollarını arar. Belirli bir Python kurulumunu kullanmak için PYTHON_LIBRARY
ortam değişkenini kurulum tarafından sağlanan libpython
paylaşılan kitaplığına ayarlayın. Örneğin:
export PYTHON_LIBRARY="~/anaconda3/lib/libpython3.7m.so"
Tam dosya adı Python ortamlarına ve platformlarına göre farklılık gösterecektir.
Alternatif olarak, Swift'e eşleşen bir Python sürümü için sistem kitaplığı yollarını araması talimatını veren PYTHON_VERSION
ortam değişkenini ayarlayabilirsiniz. PYTHON_LIBRARY
PYTHON_VERSION
göre öncelikli olduğunu unutmayın.
Kodda, PYTHON_VERSION
ayarına eşdeğer olan PythonLibrary.useVersion
işlevini de çağırabilirsiniz.
// PythonLibrary.useVersion(2)
// PythonLibrary.useVersion(3, 7)
Not: Herhangi bir Python kodunu çağırmadan önce, import Python
hemen sonra PythonLibrary.useVersion
çalıştırmalısınız. Python sürümlerini dinamik olarak değiştirmek için kullanılamaz.
Python kitaplığı yüklemesine ilişkin hata ayıklama çıktısını görmek için PYTHON_LOADER_LOGGING=1
değerini ayarlayın.
Temel bilgiler
Swift'de PythonObject
, Python'dan bir nesneyi temsil eder. Tüm Python API'leri PythonObject
örneklerini kullanır ve döndürür.
Swift'deki temel türler (sayılar ve diziler gibi) PythonObject
dönüştürülebilir. Bazı durumlarda ( PythonConvertible
argümanlarını alan değişmez değerler ve işlevler için), dönüşüm örtülü olarak gerçekleşir. PythonObject
açıkça bir Swift değeri atamak için PythonObject
başlatıcısını kullanın.
PythonObject
sayısal işlemler, indeksleme ve yineleme dahil olmak üzere birçok standart işlemi tanımlar.
// Convert standard Swift types to Python.
let pythonInt: PythonObject = 1
let pythonFloat: PythonObject = 3.0
let pythonString: PythonObject = "Hello Python!"
let pythonRange: PythonObject = PythonObject(5..<10)
let pythonArray: PythonObject = [1, 2, 3, 4]
let pythonDict: PythonObject = ["foo": [0], "bar": [1, 2, 3]]
// Perform standard operations on Python objects.
print(pythonInt + pythonFloat)
print(pythonString[0..<6])
print(pythonRange)
print(pythonArray[2])
print(pythonDict["bar"])
4.0 Hello slice(5, 10, None) 3 [1, 2, 3]
// Convert Python objects back to Swift.
let int = Int(pythonInt)!
let float = Float(pythonFloat)!
let string = String(pythonString)!
let range = Range<Int>(pythonRange)!
let array: [Int] = Array(pythonArray)!
let dict: [String: [Int]] = Dictionary(pythonDict)!
// Perform standard operations.
// Outputs are the same as Python!
print(Float(int) + float)
print(string.prefix(6))
print(range)
print(array[2])
print(dict["bar"]!)
4.0 Hello 5..<10 3 [1, 2, 3]
PythonObject
birçok standart Swift protokolüne uygunluğu tanımlar:
-
Equatable
-
Comparable
-
Hashable
-
SignedNumeric
-
Strideable
-
MutableCollection
-
ExpressibleBy_Literal
protokollerinin tümü
Bu uyumlulukların tür açısından güvenli olmadığını unutmayın: uyumsuz bir PythonObject
örneğinden protokol işlevselliğini kullanmaya çalışırsanız çökmeler meydana gelecektir.
let one: PythonObject = 1
print(one == one)
print(one < one)
print(one + one)
let array: PythonObject = [1, 2, 3]
for (i, x) in array.enumerated() {
print(i, x)
}
True False 2 0 1 1 2 2 3
Tuple'ları Python'dan Swift'e dönüştürmek için, tuple'ın niteliğini statik olarak bilmeniz gerekir.
Aşağıdaki örnek yöntemlerinden birini çağırın:
-
PythonObject.tuple2
-
PythonObject.tuple3
-
PythonObject.tuple4
let pythonTuple = Python.tuple([1, 2, 3])
print(pythonTuple, Python.len(pythonTuple))
// Convert to Swift.
let tuple = pythonTuple.tuple3
print(tuple)
(1, 2, 3) 3 (1, 2, 3)
Python yerleşikleri
Python yerleşiklerine küresel Python
arayüzü aracılığıyla erişin.
// `Python.builtins` is a dictionary of all Python builtins.
_ = Python.builtins
// Try some Python builtins.
print(Python.type(1))
print(Python.len([1, 2, 3]))
print(Python.sum([1, 2, 3]))
<class 'int'> 3 6
Python modüllerini içe aktarma
Bir Python modülünü içe aktarmak için Python.import
kullanın. Python
import
anahtar sözcüğü gibi çalışır.
let np = Python.import("numpy")
print(np)
let zeros = np.ones([2, 3])
print(zeros)
<module 'numpy' from '/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/numpy/__init__.py'> [[1. 1. 1.] [1. 1. 1.]]
Güvenli içe aktarma işlemini gerçekleştirmek için Python.attemptImport
atma işlevini kullanın.
let maybeModule = try? Python.attemptImport("nonexistent_module")
print(maybeModule)
nil
numpy.ndarray
ile dönüştürme
Aşağıdaki Swift türleri numpy.ndarray'e ve numpy.ndarray
dönüştürülebilir:
-
Array<Element>
-
ShapedArray<Scalar>
-
Tensor<Scalar>
Dönüştürme yalnızca numpy.ndarray
dtype
Element
veya Scalar
genel parametre türüyle uyumluysa başarılı olur.
Array
için numpy
dönüştürme yalnızca numpy.ndarray
1-D ise başarılı olur.
import TensorFlow
let numpyArray = np.ones([4], dtype: np.float32)
print("Swift type:", type(of: numpyArray))
print("Python type:", Python.type(numpyArray))
print(numpyArray.shape)
Swift type: PythonObject Python type: <class 'numpy.ndarray'> (4,)
// Examples of converting `numpy.ndarray` to Swift types.
let array: [Float] = Array(numpy: numpyArray)!
let shapedArray = ShapedArray<Float>(numpy: numpyArray)!
let tensor = Tensor<Float>(numpy: numpyArray)!
// Examples of converting Swift types to `numpy.ndarray`.
print(array.makeNumpyArray())
print(shapedArray.makeNumpyArray())
print(tensor.makeNumpyArray())
// Examples with different dtypes.
let doubleArray: [Double] = Array(numpy: np.ones([3], dtype: np.float))!
let intTensor = Tensor<Int32>(numpy: np.ones([2, 3], dtype: np.int32))!
[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]
Görüntüler gösteriliyor
Tıpkı Python not defterlerinde olduğu gibi matplotlib
kullanarak görüntüleri satır içi olarak görüntüleyebilirsiniz.
// This cell is here to display plots inside a Jupyter Notebook.
// Do not copy it into another environment.
%include "EnableIPythonDisplay.swift"
print(IPythonDisplay.shell.enable_matplotlib("inline"))
('inline', 'module://ipykernel.pylab.backend_inline')
let np = Python.import("numpy")
let plt = Python.import("matplotlib.pyplot")
let time = np.arange(0, 10, 0.01)
let amplitude = np.exp(-0.1 * time)
let position = amplitude * np.sin(3 * time)
plt.figure(figsize: [15, 10])
plt.plot(time, position)
plt.plot(time, amplitude)
plt.plot(time, -amplitude)
plt.xlabel("Time (s)")
plt.ylabel("Position (m)")
plt.title("Oscillations")
plt.show()
Use `print()` to show values.