কীভাবে একটি নমপি অ্যারের কয়েকটি মাত্রা সমতল করা যায়


128

"সাব-ফ্ল্যাটেন" করার বা দ্রুত স্তম্ভিত অ্যারেতে প্রথম কয়েকটি মাত্রার কিছু দ্রুত করার উপায় আছে?

উদাহরণস্বরূপ, মাত্রাগুলির একটি নমুনা অ্যারে দেওয়া (50,100,25), ফলাফলের মাত্রা হবে(5000,25)



নম্পি এনডারে অ্যারে স্লাইসিংয়ের জন্য আপনার একটি রিফ্রেশার কোর্স দরকার। মাল্টি ডাইমেনশনাল অ্যারে ইনডেক্সিং হিসাবেও পরিচিত, দেখুন: ডকস.সেসিপি.আর.ডোক / নম্পি-1.13.0 / references / arrays.indexing.html অ্যারে আপনার নাদার্রে বর্গাকার বন্ধনী ব্যবহার করে টুকরো টুকরো করে ফেলুন এবং প্রতিটিটির কতটা আলাদা করতে কমা ডিলিমেটারটি ব্যবহার করুন আপনি চান মাত্রা। এটি এর মতো কিছু দেখতে পাবেন (ঠিক তেমন নয়): your_array[50:100, 7, :]যা 3 য় অবজেক্টটিকে 2 ডি সমান করে, 2 য় মাত্রার জন্য কেবল 7 নম্বর স্লাইস ব্যবহার করে।
এরিক লেসচিনস্কি

উত্তর:


129

নামি.আরেশপে একবার দেখুন ।

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)

81

আলেকজান্ডারের উত্তরের একটি সামান্য সাধারণীকরণ - এনপি.রেশপে -1টিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করতে পারে, যার অর্থ "অন্যান্য সমস্ত তালিকাভুক্ত মাত্রার পণ্য দ্বারা বিভক্ত মোট অ্যারে আকার":

উদাহরণস্বরূপ শেষ মাত্রা ব্যতীত সমস্ত সমতল করতে:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)

33

পিটারের উত্তরের একটি সামান্য সাধারণীকরণ - আপনি যদি ত্রিমাত্রিক অ্যারে ছাড়িয়ে যেতে চান তবে আপনি মূল অ্যারের আকারের চেয়ে বেশি পরিসর নির্দিষ্ট করতে পারেন।

উদাহরণস্বরূপ শেষ দুটি মাত্রা ব্যতীত সমস্ত সমতল করতে :

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

সম্পাদনা: আমার আগের উত্তরটির জন্য একটি সামান্য সাধারণীকরণ - আপনি অবশ্যই পুনঃসাপণের শুরুতে একটি ব্যাপ্তি নির্দিষ্ট করতে পারেন:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)

2
এরই মধ্যে দু'বছরেরও বেশি সময় হয়ে গেছে ... আমাদের আরও একটি সামান্য সাধারণীকরণ প্রয়োজন! ;)
লিথ

1

বিকল্প পদ্ধতিটি হ'ল নিম্নলিখিত numpy.resize()হিসাবে ব্যবহার করা:

In [37]: shp = (50,100,25)
In [38]: arr = np.random.random_sample(shp)
In [45]: resized_arr = np.resize(arr, (np.prod(shp[:2]), shp[-1]))
In [46]: resized_arr.shape
Out[46]: (5000, 25)

# sanity check with other solutions
In [47]: resized = np.reshape(arr, (-1, shp[-1]))
In [48]: np.allclose(resized_arr, resized)
Out[48]: True
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.