ধারণাটি উপলব্ধি numpy.einsum()
করা খুব সহজ যদি আপনি এটি স্বজ্ঞাতভাবে বুঝতে পারেন। উদাহরণ হিসাবে, আসুন ম্যাট্রিক্সের গুণনের সাথে জড়িত একটি সাধারণ বিবরণ দিয়ে শুরু করা যাক ।
ব্যবহার করতে numpy.einsum()
, আপনাকে যা করতে হবে তা হ'ল তথাকথিত সাবস্ক্রিপ্ট স্ট্রিংটিকে একটি আর্গুমেন্ট হিসাবে পাস করতে হবে , তারপরে আপনার ইনপুট অ্যারেগুলি অনুসরণ করবে ।
ধরুন আপনি দুই 2D অ্যারে আছে, যাক A
এবং B
, এবং আপনি ম্যাট্রিক্স গুণ কাজ করতে চান। তুমি যা কর:
np.einsum("ij, jk -> ik", A, B)
এখানে সাবস্ক্রিপ্ট স্ট্রিং ij
অ্যারের সাথে মিল রয়েছে A
যখন সাবস্ক্রিপ্ট স্ট্রিং jk
অ্যারের সাথে মিলছে B
। এছাড়াও, এখানে উল্লেখ করার জন্য সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল প্রতিটি সাবস্ক্রিপ্ট স্ট্রিংয়ে অক্ষরের সংখ্যা অবশ্যই অ্যারের মাত্রার সাথে মেলে। (অর্থাত 2D অ্যারে, 3D অ্যারে জন্য তিনটি অক্ষর, ইত্যাদি। জন্য দুটি অক্ষর) ও আপনার মধ্যে অক্ষর পুনরাবৃত্তি যদি সাবস্ক্রিপ্ট স্ট্রিং ( j
আমাদের ক্ষেত্রে), তারপর তার মানে আপনি চান ein
সমষ্টি যারা মাত্রা বরাবর ঘটতে। সুতরাং, তারা যোগফল হ্রাস করা হবে। (অর্থাৎ সেই মাত্রাটি চলে যাবে )
এর পরে সাবস্ক্রিপ্ট স্ট্রিংটি->
হবে আমাদের ফলাফল অ্যারে। যদি আপনি এটি খালি রেখে দেন তবে সমস্ত কিছু সংক্ষিপ্ত হয়ে যাবে এবং ফলস্বরূপ একটি স্কেলারের মান ফিরে আসবে। অন্য ফলস্বর অ্যারের সাবস্ক্রিপ্ট স্ট্রিং অনুযায়ী মাত্রা থাকবে । আমাদের উদাহরণে, এটি হবেik
। এই স্বজ্ঞাত কারণ আমরা জানি ম্যাট্রিক্স গুণ জন্য অ্যারের মধ্যে কলামের সংখ্যা যে A
অ্যারের মধ্যে সারি সংখ্যা মেলে হয়েছে B
(ie গৃহস্থালির কাজ পুনরায় দ্বারা আমরা এই জ্ঞান এনকোড যা এখানে কী ঘটছে তা j
মধ্যে সাবস্ক্রিপ্ট স্ট্রিং )
সংক্ষেপেnp.einsum()
কিছু সাধারণ টেনসর বা এনডি-অ্যারে ক্রিয়াকলাপ বাস্তবায়নের ক্ষেত্রে ব্যবহার / শক্তি চিত্রিত করার জন্য আরও কয়েকটি উদাহরণ এখানে দেওয়া হল ।
ইনপুট
# a vector
In [197]: vec
Out[197]: array([0, 1, 2, 3])
# an array
In [198]: A
Out[198]:
array([[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34],
[41, 42, 43, 44]])
# another array
In [199]: B
Out[199]:
array([[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4]])
1) ম্যাট্রিক্স গুণ (অনুরূপ np.matmul(arr1, arr2)
)
In [200]: np.einsum("ij, jk -> ik", A, B)
Out[200]:
array([[130, 130, 130, 130],
[230, 230, 230, 230],
[330, 330, 330, 330],
[430, 430, 430, 430]])
2) প্রধান তির্যক বরাবর উপাদান আহরণ (অনুরূপ np.diag(arr)
)
In [202]: np.einsum("ii -> i", A)
Out[202]: array([11, 22, 33, 44])
3) হাডামারড পণ্য (অর্থাত্ দুটি অ্যারের উপাদান অনুসারে পণ্য) (এর সাথে সমান arr1 * arr2
)
In [203]: np.einsum("ij, ij -> ij", A, B)
Out[203]:
array([[ 11, 12, 13, 14],
[ 42, 44, 46, 48],
[ 93, 96, 99, 102],
[164, 168, 172, 176]])
4) উপাদান-ভিত্তিক স্কোয়ারিং (অনুরূপ )np.square(arr)
বা এর মতো arr ** 2
)
In [210]: np.einsum("ij, ij -> ij", B, B)
Out[210]:
array([[ 1, 1, 1, 1],
[ 4, 4, 4, 4],
[ 9, 9, 9, 9],
[16, 16, 16, 16]])
5) ট্রেস (অর্থাত্ মূল-তির্যক উপাদানগুলির সমষ্টি) (এর সমান np.trace(arr)
)
In [217]: np.einsum("ii -> ", A)
Out[217]: 110
6) ম্যাট্রিক্স ট্রান্সপোজ (অনুরূপ np.transpose(arr)
)
In [221]: np.einsum("ij -> ji", A)
Out[221]:
array([[11, 21, 31, 41],
[12, 22, 32, 42],
[13, 23, 33, 43],
[14, 24, 34, 44]])
)) বহিরঙ্গন পণ্য (ভেক্টরগুলির) (অনুরূপ np.outer(vec1, vec2)
)
In [255]: np.einsum("i, j -> ij", vec, vec)
Out[255]:
array([[0, 0, 0, 0],
[0, 1, 2, 3],
[0, 2, 4, 6],
[0, 3, 6, 9]])
8) অভ্যন্তরীণ পণ্য (ভেক্টরগুলির) (অনুরূপ np.inner(vec1, vec2)
)
In [256]: np.einsum("i, i -> ", vec, vec)
Out[256]: 14
9) অক্ষ 0 সহ সমষ্টি (সমান np.sum(arr, axis=0)
)
In [260]: np.einsum("ij -> j", B)
Out[260]: array([10, 10, 10, 10])
10) অক্ষ 1 সহ সমষ্টি (সমান np.sum(arr, axis=1)
)
In [261]: np.einsum("ij -> i", B)
Out[261]: array([ 4, 8, 12, 16])
11) ব্যাচ ম্যাট্রিক্স গুণ
In [287]: BM = np.stack((A, B), axis=0)
In [288]: BM
Out[288]:
array([[[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34],
[41, 42, 43, 44]],
[[ 1, 1, 1, 1],
[ 2, 2, 2, 2],
[ 3, 3, 3, 3],
[ 4, 4, 4, 4]]])
In [289]: BM.shape
Out[289]: (2, 4, 4)
# batch matrix multiply using einsum
In [292]: BMM = np.einsum("bij, bjk -> bik", BM, BM)
In [293]: BMM
Out[293]:
array([[[1350, 1400, 1450, 1500],
[2390, 2480, 2570, 2660],
[3430, 3560, 3690, 3820],
[4470, 4640, 4810, 4980]],
[[ 10, 10, 10, 10],
[ 20, 20, 20, 20],
[ 30, 30, 30, 30],
[ 40, 40, 40, 40]]])
In [294]: BMM.shape
Out[294]: (2, 4, 4)
12) অক্ষ বরাবর যোগফল 2 (সমান np.sum(arr, axis=2)
)
In [330]: np.einsum("ijk -> ij", BM)
Out[330]:
array([[ 50, 90, 130, 170],
[ 4, 8, 12, 16]])
13) অ্যারেতে সমস্ত উপাদানগুলির সমষ্টি (সমান)np.sum(arr)
)
In [335]: np.einsum("ijk -> ", BM)
Out[335]: 480
14) একাধিক অক্ষ (অর্থাত্ প্রান্তিককরণ) এর সমষ্টি
(সমানnp.sum(arr, axis=(axis0, axis1, axis2, axis3, axis4, axis6, axis7))
)
# 8D array
In [354]: R = np.random.standard_normal((3,5,4,6,8,2,7,9))
# marginalize out axis 5 (i.e. "n" here)
In [363]: esum = np.einsum("ijklmnop -> n", R)
# marginalize out axis 5 (i.e. sum over rest of the axes)
In [364]: nsum = np.sum(R, axis=(0,1,2,3,4,6,7))
In [365]: np.allclose(esum, nsum)
Out[365]: True
15) ডাবল ডট পণ্য ( এনপি.সামের অনুরূপ (হাদামার্ড-পণ্য) সিএফ. 3 )
In [772]: A
Out[772]:
array([[1, 2, 3],
[4, 2, 2],
[2, 3, 4]])
In [773]: B
Out[773]:
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
In [774]: np.einsum("ij, ij -> ", A, B)
Out[774]: 124
16) 2 ডি এবং 3 ডি অ্যারের গুণ
সমীকরণের রৈখিক সিস্টেমটি সমাধান করার সময় এই জাতীয় গুণটি খুব কার্যকর হতে পারে ( এক্স = খ ) যেখানে আপনি ফলাফল যাচাই করতে চান।
# inputs
In [115]: A = np.random.rand(3,3)
In [116]: b = np.random.rand(3, 4, 5)
# solve for x
In [117]: x = np.linalg.solve(A, b.reshape(b.shape[0], -1)).reshape(b.shape)
# 2D and 3D array multiplication :)
In [118]: Ax = np.einsum('ij, jkl', A, x)
# indeed the same!
In [119]: np.allclose(Ax, b)
Out[119]: True
বিপরীতে, যদি np.matmul()
এই যাচাইকরণের জন্য কাউকে ব্যবহার করতে হয় তবে আমাদের কয়েকটি করতে হবেreshape
করতে হয় তবে একই ফলাফলটি অর্জন করতে আমাদের বেশ অপারেশন করতে হবে যেমন:
# reshape 3D array `x` to 2D, perform matmul
# then reshape the resultant array to 3D
In [123]: Ax_matmul = np.matmul(A, x.reshape(x.shape[0], -1)).reshape(x.shape)
# indeed correct!
In [124]: np.allclose(Ax, Ax_matmul)
Out[124]: True
বোনাস : আরও গণিত এখানে পড়ুন: আইনস্টাইন-সমীকরণ এবং স্পষ্টভাবে এখানে: টেনসর-স্বরলিপি
(A * B)^T
, বা সমতুল্যB^T * A^T
।