মাত্রা তথ্য হারানো ছাড়াই নম্পুচি সূচক স্লাইস


100

আমি অদ্ভুত ব্যবহার করছি এবং মাত্রার তথ্যটি না হারিয়ে একটি সারিতে সূচি চাই।

import numpy as np
X = np.zeros((100,10))
X.shape        # >> (100, 10)
xslice = X[10,:]
xslice.shape   # >> (10,)  

এই উদাহরণে xslice এখন 1 মাত্রা, তবে আমি এটি হতে চাই (1,10)। আর-তে, আমি এক্স [10,:, ড্রপ = এফ] ব্যবহার করব। অদ্ভুত কিছু আছে কি? আমি এটি ডকুমেন্টেশনে খুঁজে পাইনি এবং অনুরূপ অনুরূপ প্রশ্ন দেখিনি।

ধন্যবাদ!

উত্তর:


59

এটি করা সম্ভবত সবচেয়ে সহজ x[None, 10, :]বা সমতুল্য (তবে আরও পাঠযোগ্য) x[np.newaxis, 10, :]

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

এছাড়াও, নম্পি হ্যান্ডেল ব্রডকাস্টিং অ্যারেগুলি খুব ভাল, তাই স্লাইসটি যে ধরণের অ্যারের থেকে এসেছে তার অ্যারের মাত্রা ধরে রাখার খুব কম কারণ আছে। যদি আপনি তা করেন তবে জিনিসগুলি যেমন:

a = np.zeros((100,100,10))
b = np.zeros(100,10)
a[0,:,:] = b

হয় কাজ করবে না বা বাস্তবায়ন করা আরও অনেক কঠিন হবে।

(বা কমপক্ষে কাটানোর সময় ডাইমেনশন তথ্য বাদ দেওয়ার পিছনে নিম্পি দেবের যুক্তিতে আমার ধারণা)


6
@ লিসা: x[None, 10]আপনি যা চান তা করবেন।
nnot101

হা. আপনার Noneকাটা আবছার পাশে আপনার গুলি রাখুন ।
ম্যাড পদার্থবিদ

4
উদাহরণটিতে অ্যাসাইনমেন্টে টিউপলের জন্য অতিরিক্ত বন্ধনী অনুপস্থিত b; এটা হওয়া উচিত b = np.zeros((100,10))
জেরজি

মাত্র দুটি পরিবর্তে মোট 3 টি সূচক ব্যবহার করার কারণ কী? আমি বলতে চাইছি X[10,None](উদাহরণ হিসাবে আপনার কোড ব্যবহার করে)।
গ্রীনল্ডম্যান

9
" অ্যারের মাত্রা বজায় রাখার খুব কম কারণ আছে " ... ভাল এটি অবশ্যই, পুরোপুরি এবং সম্পূর্ণভাবে ম্যাট্রিক্সের গুণ ( np.matmul()বা@ ) স্ক্রু করবে । সবেই জ্বলে উঠলাম।
জিন-ফ্রানসোয়া কার্বেট

93

আর একটি সমাধান করণীয়

X[[10],:]

বা

I = array([10])
X[I,:]

সূচকের তালিকা (বা একটি অ্যারে) দ্বারা সূচক সম্পাদন করা হলে অ্যারের মাত্রিকতা সংরক্ষণ করা হয়। এটি দুর্দান্ত কারণ এটি আপনাকে মাত্রা বজায় রাখা এবং সঙ্কুচিত করার মধ্যে পছন্দটি রেখে দেয়।


4
এটি অ্যারের ডেটা অনুলিপি করে
প্রতি

এই সবসময় তা হয় না। দেখুন: x = np.array([[1,2,3,4]]) আপনি যদি এটির সাথে এটির x[[0],[1,2]] দ্বি-মাত্রিক পেয়ে থাকেন তবে array([2, 3]) আমার মতে কলাম বা সারি ভেক্টর নির্বাচন করার সময় স্লাইসটি সহজ করে তারপরে ব্যবহার করা ভাল np.reshape, সুতরাং আমার উদাহরণে এটি হবেnp.reshape(x[0,[1,2]],[1,2])
আলেকজান্ডার

4
অন্যেরা, শেষে একটি সেমিকোলন সম্পর্কে সচেতন হন - এটি গুরুত্বপূর্ণ, X[[10]]ব্যাখ্যা করা X[10]হবে এবং আকারটি আরও ছোট হবে; একইভাবে, X[[10, 20]] == X[10, 20]এবং আকারটি আরও ছোট
বেন উসমান

4
সতর্কতা : ইনডেক্সিংয়ের এই পদ্ধতিটিকে কেবল পূর্ণসংখ্যার সূচকগুলির সাথে মিশ্রিত করবেন না! যদি আপনার aআকৃতি থাকে (10, 20, 30)তবে আকৃতিটি a[0, :, [0]]হবে (1, 20)না (20, 1), কারণ পরের সূচিগুলিতে সম্প্রচারিত হয় a[[0], :, [0]]যা প্রায়শই আপনি প্রত্যাশা করেন না! যেখানে প্রত্যাশা অনুযায়ী a[0, :, :1]আপনাকে দেবে (20, 1)। তদুপরি, একক সূচক সহ অদ্ভুত প্রান্তের ক্ষেত্রে উপরের মন্তব্যটি দেখুন। সামগ্রিকভাবে, মনে হচ্ছে এই পদ্ধতিতে অনেকগুলি প্রান্তের কেস রয়েছে।
বেন উসমান

30

আমি কয়েকটি যুক্তিসঙ্গত সমাধান পেয়েছি।

1) ব্যবহার numpy.take(X,[10],0)

2) এই অদ্ভুত সূচক ব্যবহার করুন X[10:11:, :]

আদর্শভাবে, এটি ডিফল্ট হওয়া উচিত। আমি কখনই বুঝতে পারি না কেন মাত্রা কখনও বাদ দেওয়া হয়। তবে তা নালীর জন্য আলোচনা ...


4
পাইথন তালিকাকে সূচীকরণ করার সময় 'মাত্রা' বাদ দেওয়া হয় alist[0]এবং সেগুলি টুকরা করার সময় রাখা হয়।
hpulj

4
বিকল্প 2 (যা slice(n, n+1)সূচক আহরণের জন্য লেখা যেতে পারে n) এর গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি কেবলমাত্র প্রাকৃতিকভাবে প্রাক-মাত্রিক ক্ষেত্রে প্রসারিত।
norok2

অপশন 2 X[10:11, :]পাইথন ৩.7.৫ (যেমন 11 এর পরে অতিরিক্ত কোলন ব্যতীত) লিখিত হতে সক্ষম বলে মনে হচ্ছে
জো

7

আমার কাছে আরও ভাল পছন্দ করা একটি বিকল্প এখানে রয়েছে। একক সংখ্যার সাথে সূচকের পরিবর্তে পরিসীমা সহ সূচক। যে, ব্যবহার X[10:11,:]। (নোট যাতে 10:1111 টি অন্তর্ভুক্ত নয়)।

import numpy as np
X = np.zeros((100,10))
X.shape        # >> (100, 10)
xslice = X[10:11,:]
xslice.shape   # >> (1,10)

এটি আরও মাত্রা সহ খুব সহজে বুঝতে সহজ করে তোলে, কোন Noneসূচিটি কোন অক্ষরটি ব্যবহার করতে হবে তা কোনও জাগলিং এবং নির্ধারণ করা যায় না। এছাড়াও অ্যারে আকার সম্পর্কিত অতিরিক্ত বুককিপিংয়ের দরকার নেই, কেবলমাত্র আপনি নিয়মিত সূচকে ব্যবহার করতে পারেন এমন i:i+1কোনও জন্য i

b = np.ones((2, 3, 4))
b.shape # >> (2, 3, 4)
b[1:2,:,:].shape  # >> (1, 3, 4)
b[:, 2:3, :].shape .  # >> (2, 1, 4)


0

এটি বিশেষত বিরক্তিকর যদি আপনি এমন কোনও অ্যারের দ্বারা সূচনা করছেন যা রানটাইম সময় 1 দৈর্ঘ্য হতে পারে। সেক্ষেত্রে, এখানে রয়েছে np.ix_:

some_array[np.ix_(row_index,column_index)]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.