অদ্ভুত ব্যবহার করে অদ্ভুত সূচক


27

আমার একটি পরিবর্তনশীল আছে, এক্স, এটি আকৃতির (2,2,50,100)।

আমার কাছে একটি অ্যারেও রয়েছে, y, যা এনপি.আরয়ের সমান ([0,10,20])। আমি এক্স [0,:,:, y] সূচিত করলে একটি অদ্ভুত জিনিস ঘটে।

x = np.full((2,2,50,100),np.nan)
y = np.array([0,10,20])
print(x.shape)
(2,2,50,100)
print(x[:,:,:,y].shape)
(2,2,50,3)
print(x[0,:,:,:].shape)
(2,50,100)
print(x[0,:,:,y].shape)
(3,2,50)

কেন সর্বশেষ এক আউটপুট (3,2,50) এবং (2,50,3) হয় না?


আমি নির্লজ্জে নতুন, তাই আপনার প্রশ্নের উত্তর আমার কাছে নেই। এটি আরও তদন্ত করতে, আমি একটি ছোট উদাহরণ সন্ধান করার পরামর্শ দিচ্ছি যা কেবলমাত্র 2D বা 3 ডি এবং যে কোনও অক্ষের প্রায় 10 টির মতো উপাদান।
কোড-শিক্ষানবিস

উত্তর:


21

অ্যারি আকারগুলি সম্প্রচার করতে নম্পি এইভাবে অ্যাডভান্সড ইনডেক্সিং ব্যবহার করে। যখন আপনি 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ফাংশনে যেমন স্লাইস থেকে বাদ দেওয়া হয়েছে ।

সুতরাং মূলত, যদি আপনি এমন একটি স্লাইস তৈরি করতে পারেন যা আপনার গ্রাহকতার মানদণ্ডের সাথে খাপ খায় তবে আপনি অ্যাসাইনমেন্টটি করতে পারেন।


4

একে বলা হয় combining advanced and basic indexing। ইন combining advanced and basic indexing, সূচক উন্নত ইন্ডেক্স প্রথম ফলাফলের মৌলিক ইন্ডেক্স মাত্রা কি numpy এবং subspace / CONCATENATE।

দস্তাবেজ থেকে উদাহরণ:

X. আকার আকারে (10,20,30,40,50) হওয়া যাক এবং ধরুন ind_1 এবং ind_2 আকারে সম্প্রচারিত হতে পারে (2,3,4)। তারপরে x [:, ind_1, ind_2] এর আকার হবে (10,2,3,4,40,50) কারণ এক্স থেকে (20,30) -র আকারের উপ-স্থানটি (2,3,4) উপ-স্থানের সাথে প্রতিস্থাপন করা হয়েছে সূচকগুলি। যাইহোক, এক্স [: ind_1: ind_2] আকৃতি আছে (2,3,4,10,30,50) , সূচক subspace ড্রপ করার কোন দ্ব্যর্থহীন জায়গা না থাকায় এভাবেই হয় tacked অন শুরুতে । উপসর্গটি যে কোনও জায়গায় সরাতে .transpose () ব্যবহার করা সর্বদা সম্ভব। নোট করুন যে উদাহরণটি টেক ব্যবহার করে প্রতিরূপ করা যাবে না।

তাই, উপর x[0,:,:,y], 0এবং yঅগ্রিম ইন্ডেক্স হয়। তারা একসাথে সম্প্রচারিত মাত্রা উত্পাদন (3,)

In [239]: np.broadcast(0,y).shape
Out[239]: (3,)

এটি (3,)দ্বিতীয় এবং তৃতীয় মাত্রার শুরুতে শুরু করে(3, 2, 50)

1 ম এবং শেষের মাত্রাটি সত্যই একসাথে সম্প্রচার 0করছে [0,1]তা দেখতে আপনি সম্প্রচারের ত্রুটিটি দেখতে পরিবর্তনের চেষ্টা করতে পারেন

print(x[[0,1],:,:,y])

Output:
IndexError                                Traceback (most recent call last)
<ipython-input-232-5d10156346f5> in <module>
----> 1 x[[0,1],:,:,y]

IndexError: shape mismatch: indexing arrays could not be broadcast together with
 shapes (2,) (3,)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.