Python birlikte çalışabilirliği

TensorFlow.org'da görüntüle Google Colab'da çalıştırın Kaynağı GitHub'da görüntüle

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 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()

png

Use `print()` to show values.