این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

قابلیت همکاری پایتون

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub

Swift For TensorFlow از قابلیت همکاری پایتون پشتیبانی می کند.

می توانید ماژول های پایتون را از Swift وارد کنید ، با توابع Python تماس بگیرید و مقادیر بین Swift و Python را تبدیل کنید.

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

تنظیم نسخه پایتون

به طور پیش فرض ، هنگام import Python ، سوئیفت مسیرهای کتابخانه سیستم را برای جدیدترین نسخه پایتون نصب شده جستجو می کند. برای استفاده از نصب خاص پایتون ، متغیر محیط PYTHON_LIBRARY را روی کتابخانه مشترک libpython ارائه شده توسط نصب تنظیم کنید. مثلا:

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

نام دقیق فایل در محیط ها و سیستم عامل های پایتون متفاوت خواهد بود.

همچنین می توانید متغیر محیط PYTHON_VERSION را تنظیم کنید ، که به Swift دستور می دهد مسیرهای کتابخانه سیستم را برای نسخه تطبیق پایتون جستجو کند. توجه داشته باشید که PYTHON_LIBRARY بر PYTHON_VERSION اولویت دارد.

در کد ، می توانید با تابع PythonLibrary.useVersion تماس PythonLibrary.useVersion ، که معادل تنظیم PYTHON_VERSION .

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

توجه: قبل از فراخوانی کد import Python ، باید PythonLibrary.useVersion درست پس از import Python اجرا کنید. نمی توان از آن برای تغییر پویای نسخه های پایتون استفاده کرد.

PYTHON_LOADER_LOGGING=1 تنظیم کنید تا خروجی اشکال زدایی برای بارگذاری کتابخانه پایتون را مشاهده کنید .

اصول

در Swift ، PythonObject شیئی را از Python نشان می دهد. همه API های Python از PythonObject نمونه استفاده می کنند و آن را برمی PythonObject .

انواع اساسی در Swift (مانند اعداد و آرایه ها) به PythonObject قابل تبدیل هستند. در برخی موارد (برای PythonConvertible و توابع با استفاده از آرگومان های PythonConvertible ) ، تبدیل به طور ضمنی اتفاق می افتد. برای اینکه مقدار Swift را به طور واضح به PythonObject ، از PythonObject اولیه PythonObject استفاده کنید.

PythonObject بسیاری از عملیات استاندارد را تعریف می کند ، از جمله عملیات عددی ، نمایه سازی و تکرار.

// 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 مطابقت بسیاری از پروتکل های استاندارد Swift را تعریف می کند:

  • Equatable
  • Comparable
  • Hashable
  • SignedNumeric
  • Strideable
  • MutableCollection
  • همه پروتکل های ExpressibleBy_Literal

توجه داشته باشید که این مطابقت ها از نظر نوع ایمن نیستند: اگر بخواهید از قابلیت پروتکل از نمونه 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

برای تبدیل تاپل از پایتون به سوئیفت ، باید از نظر آماری میزان تاپل را بدانید.

با یکی از روشهای نمونه زیر تماس بگیرید:

  • 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 دسترسی پیدا کنید.

// `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 از Python.import استفاده کنید. مانند کلمه کلیدی import در 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.]]

برای انجام ایمن وارد کردن ، از عملکرد پرتاب Python.attemptImport .

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

تبدیل با numpy.ndarray

انواع Swift زیر را می توان به و از numpy.ndarray :

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

تبدیل فقط درصورتی موفقیت dtype که numpy.ndarray با نوع پارامتر عمومی Element یا Scalar سازگار باشد.

برای Array ، تبدیل از numpy فقط در صورت موفقیت numpy.ndarray بودن numpy.ndarray 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.]

نمایش تصاویر

می توانید دقیقاً مانند نوت بوک های پایتون با استفاده از matplotlib تصاویر را بصورت خطی نمایش دهید.

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