অ্যারি আকারগুলি সম্প্রচার করতে নম্পি এইভাবে অ্যাডভান্সড ইনডেক্সিং ব্যবহার করে। যখন আপনি 0
প্রথম সূচকের জন্য একটি পাস করেন , এবং y
শেষ সূচকের জন্য, নম্পিটি 0
একই আকারে সম্প্রচার করবে y
। নিম্নলিখিত সমানতা ঝুলিতে: x[0,:,:,y] == x[(0, 0, 0),:,:,y]
। এখানে একটি উদাহরণ
import numpy as np
x = np.arange(120).reshape(2,3,4,5)
y = np.array([0,2,4])
np.equal(x[0,:,:,y], x[(0, 0, 0),:,:,y]).all()
# returns:
True
এখন, আপনি কার্যকরভাবে দুটি সূচকের সূচকে পার করছেন, তাই আপনি সূচকগুলির জোড়া তৈরি করতে (এই ক্ষেত্রে) উন্নত সূচীকরণ API ব্যবহার করছেন।
x[(0, 0, 0),:,:,y])
# equivalent to
[
x[0,:,:,y[0]],
x[0,:,:,y[1]],
x[0,:,:,y[2]]
]
# equivalent to
rows = np.array([0, 0, 0])
cols = y
x[rows,:,:,cols]
# equivalent to
[
x[r,:,:,c] for r, c in zip(rows, columns)
]
দৈর্ঘ্যের সমান, যার প্রথম মাত্রা রয়েছে y
। এটি আপনি দেখতে পাচ্ছেন।
উদাহরণ হিসাবে, 4 টি মাত্রা সহ একটি অ্যারে দেখুন যা পরবর্তী অংশে বর্ণিত হয়েছে:
x = np.arange(120).reshape(2,3,4,5)
y = np.array([0,2,4])
# x looks like:
array([[[[ 0, 1, 2, 3, 4], -+ =+
[ 5, 6, 7, 8, 9], Sheet1 |
[ 10, 11, 12, 13, 14], | |
[ 15, 16, 17, 18, 19]], -+ |
Workbook1
[[ 20, 21, 22, 23, 24], -+ |
[ 25, 26, 27, 28, 29], Sheet2 |
[ 30, 31, 32, 33, 34], | |
[ 35, 36, 37, 38, 39]], -+ |
|
[[ 40, 41, 42, 43, 44], -+ |
[ 45, 46, 47, 48, 49], Sheet3 |
[ 50, 51, 52, 53, 54], | |
[ 55, 56, 57, 58, 59]]], -+ =+
[[[ 60, 61, 62, 63, 64],
[ 65, 66, 67, 68, 69],
[ 70, 71, 72, 73, 74],
[ 75, 76, 77, 78, 79]],
[[ 80, 81, 82, 83, 84],
[ 85, 86, 87, 88, 89],
[ 90, 91, 92, 93, 94],
[ 95, 96, 97, 98, 99]],
[[100, 101, 102, 103, 104],
[105, 106, 107, 108, 109],
[110, 111, 112, 113, 114],
[115, 116, 117, 118, 119]]]])
x
ক্রমহীন ফর্মটি বোঝার জন্য খুব সহজ একটি পদ্ধতি রয়েছে যা আমরা এখন কী ঘটছে তা দেখাতে ব্যবহার করতে পারি ...
প্রথম মাত্রাটি 2 এক্সেল ওয়ার্কবুকগুলি রাখার মতো, দ্বিতীয় মাত্রাটি প্রতিটি ওয়ার্কবুকে 3 টি শীট রাখার মতো, তৃতীয় মাত্রা প্রতিটি শিটের জন্য 4 টি সারি থাকার মতো, এবং শেষ মাত্রা প্রতিটি সারিটির জন্য 5 টি মান (বা শিটের প্রতি কলাম))
এইভাবে এটির দিকে চেয়ে, এই অনুরোধটি জিজ্ঞাসা করা x[0,:,:,0]
হচ্ছে: "প্রথম ওয়ার্কবুকে, প্রতিটি শিটের জন্য, প্রতিটি সারির জন্য, আমাকে প্রথম মান / কলাম দিন" "
x[0,:,:,y[0]]
# returns:
array([[ 0, 5, 10, 15],
[20, 25, 30, 35],
[40, 45, 50, 55]])
# this is in the same as the first element in:
x[(0,0,0),:,:,y]
কিন্তু এখন উন্নত ইন্ডেক্স সঙ্গে, আমরা মনে করতে পারেন x[(0,0,0),:,:,y]
হিসাবে "প্রথম ওয়ার্কবুক, প্রত্যেক শীট জন্য, প্রতিটি সারির জন্য, আমাকে দিতে y
তম মান / কলাম। ঠিক আছে, এখন এটি প্রতিটি মানের জন্য কি করতে y
"
x[(0,0,0),:,:,y]
# returns:
array([[[ 0, 5, 10, 15],
[20, 25, 30, 35],
[40, 45, 50, 55]],
[[ 2, 7, 12, 17],
[22, 27, 32, 37],
[42, 47, 52, 57]],
[[ 4, 9, 14, 19],
[24, 29, 34, 39],
[44, 49, 54, 59]]])
যেখানে এটি পাগল হয়ে যায় তা হল সূচি সূচকগুলির বাহ্যিক মাত্রাগুলির সাথে মেলে broadcast সুতরাং আপনি যদি উপরের মতো একই ক্রিয়াকলাপ করতে চান তবে "এক্সেল ওয়ার্কবুকস" উভয়ের জন্য আপনাকে লুপ এবং কনটেনেট করতে হবে না। আপনি কেবল প্রথম মাত্রায় একটি অ্যারে পাস করতে পারেন, তবে এটির একটি সামঞ্জস্যপূর্ণ আকার থাকতে হবে ।
পূর্ণসংখ্যা পাস করাতে সম্প্রচারিত হয় y.shape == (3,)
। আপনি যদি প্রথম সূচক হিসাবে কোনও অ্যারে পাস করতে চান তবে অ্যারের কেবলমাত্র শেষ মাত্রার সাথে সামঞ্জস্য থাকতে হবে y.shape
। অর্থাৎ প্রথম সূচকের শেষ মাত্রা হয় 3 বা 1 হতে হবে।
ix = np.array([[0], [1]])
x[ix,:,:,y].shape
# each row of ix is broadcast to length 3:
(2, 3, 3, 4)
ix = np.array([[0,0,0], [1,1,1]])
x[ix,:,:,y].shape
# this is identical to above:
(2, 3, 3, 4)
ix = np.array([[0], [1], [0], [1], [0]])
x[ix,:,:,y].shape
# ix is broadcast so each row of ix has 3 columns, the length of y
(5, 3, 3, 4)
দস্তাবেজে একটি সংক্ষিপ্ত ব্যাখ্যা পাওয়া গেছে: https://docs.scipy.org/doc/numpy/references/arrays.indexing.html#combining-advanced-and-basic-indexing
সম্পাদনা:
আসল প্রশ্ন থেকে, আপনার পছন্দসই সাবস্ক্রাইবিংয়ের একটি-লাইন পেতে, আপনি এটি ব্যবহার করতে পারেন x[0][:,:,y]
:
x[0][:,:,y].shape
# returns
(2, 50, 3)
তবে, আপনি যদি এই সাবস্ক্রাইবগুলিকে বরাদ্দ করার চেষ্টা করছেন , আপনাকে খুব সতর্কতা অবলম্বন করতে হবে যে আপনি আসল অ্যারের ভাগ করা মেমরি ভিউটি দেখছেন। অন্যথায় অ্যাসাইনমেন্টটি মূল অ্যারেতে হবে না, তবে একটি অনুলিপি।
ভাগ করা মেমরি কেবল তখনই ঘটে যখন আপনি আপনার অ্যারের সাবসেট করার জন্য একটি পূর্ণসংখ্যা বা স্লাইস ব্যবহার করছেন, x[:,0:3,:,:]
বা x[0,:,:,1:-1]
।
np.shares_memory(x, x[0])
# returns:
True
np.shares_memory(x, x[:,:,:,y])
# returns:
False
আপনার মূল প্রশ্ন এবং আমার উদাহরণ উভয়ই y
কোনও ইনট বা স্লাইস নয়, তাই সর্বদা আসলটির অনুলিপিটি অর্পণ করা হবে।
কিন্ত! যেহেতু আপনার অ্যারেটি y
একটি স্লাইস হিসাবে প্রকাশ করা যেতে পারে, আপনি আসলে আপনার অ্যারের একটি নির্ধারিত দৃশ্য পেতে পারেন :
x[0,:,:,0:21:10].shape
# returns:
(2, 50, 3)
np.shares_memory(x, x[0,:,:,0:21:10])
# returns:
True
# actually assigns to the original array
x[0,:,:,0:21:10] = 100
এখানে 0:21:10
প্রতিটি সূচিটি হ'তে আমরা স্লাইসটি ব্যবহার করি range(0,21,10)
। আমাদের ব্যবহার করতে হবে 21
এবং না 20
কারণ স্টপ পয়েন্টটি range
ফাংশনে যেমন স্লাইস থেকে বাদ দেওয়া হয়েছে ।
সুতরাং মূলত, যদি আপনি এমন একটি স্লাইস তৈরি করতে পারেন যা আপনার গ্রাহকতার মানদণ্ডের সাথে খাপ খায় তবে আপনি অ্যাসাইনমেন্টটি করতে পারেন।