পাইথন ইন্টারঅপারেবিলিটি

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন

সুইফট ফর টেনসরফ্লো পাইথন ইন্টারঅপারেবিলিটি সমর্থন করে।

আপনি সুইফট থেকে পাইথন মডিউল আমদানি করতে পারেন, পাইথন ফাংশন কল করতে পারেন এবং সুইফট এবং পাইথনের মধ্যে মানগুলি রূপান্তর করতে পারেন।

import PythonKit
print(Python.version)
3.6.9 (default, Oct  8 2020, 12:12:24) 
[GCC 8.4.0]

পাইথন সংস্করণ সেট করা হচ্ছে

ডিফল্টরূপে, আপনি যখন import Python , তখন সুইফট ইনস্টল করা পাইথনের নতুন সংস্করণের জন্য সিস্টেম লাইব্রেরি পাথ অনুসন্ধান করে। একটি নির্দিষ্ট Python ইনস্টলেশন ব্যবহার করতে, ইনস্টলেশনের দ্বারা প্রদত্ত libpython শেয়ার্ড লাইব্রেরিতে PYTHON_LIBRARY এনভায়রনমেন্ট ভেরিয়েবল সেট করুন। উদাহরণ স্বরূপ:

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

পাইথন পরিবেশ এবং প্ল্যাটফর্ম জুড়ে সঠিক ফাইলের নাম আলাদা হবে।

বিকল্পভাবে, আপনি PYTHON_VERSION এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন, যা সুইফটকে পাইথন সংস্করণের জন্য সিস্টেম লাইব্রেরি পাথ অনুসন্ধান করতে নির্দেশ দেয়। মনে রাখবেন যে PYTHON_LIBRARY PYTHON_VERSION এর চেয়ে অগ্রাধিকার নেয়।

কোডে, আপনি PythonLibrary.useVersion ফাংশনকেও কল করতে পারেন, যা PYTHON_VERSION সেট করার সমতুল্য।

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

দ্রষ্টব্য: কোনো পাইথন কোড কল করার আগে আপনাকে import Python ঠিক পরে PythonLibrary.useVersion চালাতে হবে। এটি পাইথন সংস্করণগুলি গতিশীলভাবে স্যুইচ করতে ব্যবহার করা যাবে না।

পাইথন লাইব্রেরি লোড করার জন্য ডিবাগ আউটপুট দেখতে PYTHON_LOADER_LOGGING=1 সেট করুন।

বেসিক

সুইফটে, PythonObject পাইথন থেকে একটি বস্তুর প্রতিনিধিত্ব করে। সমস্ত Python API ব্যবহার করে এবং PythonObject দৃষ্টান্ত প্রদান করে।

সুইফটের মৌলিক প্রকারগুলি (যেমন সংখ্যা এবং অ্যারে) PythonObject এ রূপান্তরযোগ্য। কিছু ক্ষেত্রে ( PythonConvertible আর্গুমেন্ট গ্রহণের আক্ষরিক এবং ফাংশনগুলির জন্য), রূপান্তরটি অন্তর্নিহিতভাবে ঘটে। 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 অনেক স্ট্যান্ডার্ড সুইফ্ট প্রোটোকলের সাথে সামঞ্জস্যকে সংজ্ঞায়িত করে:

  • 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 ব্যবহার করুন। এটি Python import কীওয়ার্ডের মতো কাজ করে।

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 দিয়ে রূপান্তর

নিম্নলিখিত সুইফট প্রকারগুলি numpy.ndarray এ এবং থেকে রূপান্তর করা যেতে পারে:

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

numpy.ndarray এর dtype Element বা Scalar জেনেরিক প্যারামিটারের সাথে সামঞ্জস্যপূর্ণ হলেই রূপান্তর সফল হয়।

Array এর জন্য, numpy থেকে রূপান্তর শুধুমাত্র তখনই সফল হয় যদি 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"
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.