Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Współdziałanie Pythona

Zobacz na TensorFlow.org Wyświetl źródło na GitHub

Swift For TensorFlow obsługuje współdziałanie języka Python.

Możesz importować moduły Pythona ze Swift, wywoływać funkcje Pythona i konwertować wartości między Swift i Python.

import PythonKit
print(Python.version)
3.6.9 (default, Jul 17 2020, 12:50:27) 
[GCC 8.4.0]

Ustawianie wersji Pythona

Domyślnie, kiedy import Python , Swift przeszukuje ścieżki bibliotek systemowych w poszukiwaniu najnowszej zainstalowanej wersji Pythona. Aby użyć określonej instalacji PYTHON_LIBRARY Python, ustaw PYTHON_LIBRARY środowiskową libpython udostępnioną bibliotekę libpython udostępnioną podczas instalacji. Na przykład:

export PYTHON_LIBRARY="~/anaconda3/lib/libpython3.7m.so"

Dokładna nazwa pliku będzie się różnić w różnych środowiskach i platformach Pythona.

Alternatywnie możesz ustawić PYTHON_VERSION środowiskową PYTHON_VERSION , która instruuje Swift, aby przeszukał ścieżki bibliotek systemowych w celu znalezienia pasującej wersji Pythona. Pamiętaj, że PYTHON_LIBRARY ma pierwszeństwo przed PYTHON_VERSION .

W kodzie można również wywołać funkcję PythonLibrary.useVersion , która jest równoważna ustawieniu PYTHON_VERSION .

// PythonLibrary.useVersion(2)
// PythonLibrary.useVersion(3, 7)

Uwaga: powinieneś uruchomić PythonLibrary.useVersion zaraz po import Python , przed wywołaniem dowolnego kodu Pythona. Nie można go używać do dynamicznego przełączania wersji Pythona.

Ustaw PYTHON_LOADER_LOGGING=1 aby zobaczyć wyjście debugowania dla ładowania biblioteki Python .

Podstawy

W języku Swift PythonObject reprezentuje obiekt z Pythona. Wszystkie interfejsy API języka Python używają instancji PythonObject i zwracają PythonObject .

Podstawowe typy w Swift (takie jak liczby i tablice) można konwertować na PythonObject . W niektórych przypadkach (w przypadku literałów i funkcji pobierających argumenty PythonConvertible ) konwersja zachodzi niejawnie. Aby jawnie rzutować wartość Swift na PythonObject , użyj inicjatora PythonObject .

PythonObject definiuje wiele standardowych operacji, w tym operacje numeryczne, indeksowanie i iterację.

// 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 definiuje zgodność z wieloma standardowymi protokołami Swift:

  • Equatable
  • Comparable
  • Hashable
  • SignedNumeric
  • Strideable
  • MutableCollection
  • Wszystkie protokoły ExpressibleBy_Literal

Należy zauważyć, że te zgodności nie są bezpieczne dla typów: w przypadku próby użycia funkcji protokołu z niezgodnej instancji PythonObject .

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

Aby przekonwertować krotki z Pythona na Swift, musisz statycznie znać liczbę krotek.

Wywołaj jedną z następujących metod instancji:

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

Wbudowane Python

Uzyskaj dostęp do wbudowanych Pythona za pośrednictwem globalnego interfejsu Python .

// `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

Importowanie modułów Pythona

Użyj Python.import aby zaimportować moduł Pythona. Działa jak słowo kluczowe import w Python .

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.]]

Użyj funkcji rzucającej Python.attemptImport aby wykonać bezpieczne importowanie.

let maybeModule = try? Python.attemptImport("nonexistent_module")
print(maybeModule)
nil

Konwersja z numpy.ndarray

Następujące typy Swift można konwertować do iz numpy.ndarray :

  • Array<Element>
  • ShapedArray<Scalar>
  • Tensor<Scalar>

Konwersja powiedzie się tylko wtedy, gdy dtype z numpy.ndarray jest kompatybilny z Element lub Scalar generycznego typ parametru.

W przypadku Array konwersja z numpy powiedzie się tylko wtedy, gdy numpy.ndarray ma wartość 1-D.

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.]

Wyświetlanie obrazów

Możesz wyświetlać obrazy w linii za pomocą matplotlib , tak jak w notatnikach Pythona.

// This cell is here to display plots inside a Jupyter Notebook.
// Do not copy it into another environment.
%include "EnableIPythonDisplay.swift"
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

None