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


111

ধরুন আমার আছে;

LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays

আমি রূপান্তর করার চেষ্টা করি;

array([[1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5],
       [1, 2, 3, 4, 5])

আমি এখনই এটি vstack এ পুনরাবৃত্তি দ্বারা সমাধান করছি তবে এটি বিশেষত বৃহত তালিকার জন্য সত্যিই ধীর

আপনি সবচেয়ে কার্যকর উপায় জন্য কি পরামর্শ?


4
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])]এটি পাইথন সিনট্যাক্স সঠিক নয়। পরিষ্কার করে বলো.
মার্সিন

উত্তর:


141

সাধারণভাবে আপনি যে কোনও অক্ষ বরাবর অ্যারেগুলির সম্পূর্ণ ক্রমটি একত্রিত করতে পারেন:

numpy.concatenate( LIST, axis=0 )

কিন্তু আপনি কি (, আপনি তা নিশ্চিত করার জন্য তারা সব 2-মাত্রিক এন-দ্বারা-5 অ্যারে ইতিমধ্যেই আছে একটি 2-মাত্রিক 3x5 আউটপুট জন্য) আকৃতি এবং তালিকার প্রতিটি অ্যারের মাত্রা সম্পর্কে চিন্তা করতে হবে। আপনি যদি 1-মাত্রিক অ্যারেগুলিকে 2-মাত্রিক আউটপুটের সারি হিসাবে যুক্ত করতে চান, আপনার তাদের মাত্রিকতা প্রসারিত করতে হবে।

জর্জের উত্তরটি উল্লেখ করার সাথে সাথে এখানে ফাংশনটিও রয়েছে stack, যা অসাধারণ 1.10 তে প্রবর্তিত হয়েছিল:

numpy.stack( LIST, axis=0 )

এটি পরিপূরক পদ্ধতির গ্রহণ করে: এটি প্রতিটি ইনপুট অ্যারের একটি নতুন দর্শন তৈরি করে এবং একটি অতিরিক্ত মাত্রা যুক্ত করে (এই ক্ষেত্রে, বাম দিকে, তাই প্রতিটি- nএলিমেন্ট 1 ডি অ্যারে 1-বাই-2 ডি অ্যারে হয়ে যায়) কনটেনেট nকরার আগে। এটি কেবল তখনই কাজ করবে যদি সমস্ত ইনপুট অ্যারেগুলির সমান আকার থাকে — এমনকি কাঠের অক্ষের সাথেও।

vstack(বা সমতুল্য row_stack) প্রায়শই সহজেই ব্যবহারযোগ্য সহজ সমাধান কারণ এটি 1- এবং / অথবা 2-মাত্রিক অ্যারেগুলির ক্রম গ্রহণ করবে এবং সম্পূর্ণ তালিকা একসাথে একত্রিত করার আগে যেখানে প্রয়োজনীয় এবং কেবল যেখানে প্রয়োজন সেখানে স্বয়ংক্রিয়ভাবে প্রসারিত করবে। যেখানে একটি নতুন মাত্রা প্রয়োজন, এটি বামে যুক্ত করা হয়েছে। আবার, আপনি পুনরাবৃত্তি করার প্রয়োজন ছাড়াই একবারে একটি সম্পূর্ণ তালিকা একত্রিত করতে পারেন:

numpy.vstack( LIST )

এই নমনীয় আচরণটি সিনট্যাকটিক শর্টকাট দ্বারা প্রদর্শিত হয় numpy.r_[ array1, ...., arrayN ](বর্গাকার বন্ধনী নোট করুন)। এটি সুস্পষ্টভাবে কিছু নামযুক্ত অ্যারে যুক্ত করার জন্য ভাল তবে আপনার অবস্থার পক্ষে ভাল নয় কারণ এই সিনট্যাক্সটি আপনার মতো অ্যারেগুলির ক্রম গ্রহণ করবে না LIST

অনুভূমিক (কলাম- ওয়াইজ ) স্ট্যাকিংয়ের জন্য একটি অ্যানালগাস ফাংশন column_stackএবং শর্টকাটও রয়েছে c_[...], পাশাপাশি একটি প্রায়- সমানুক্রমিক ফাংশন- hstackকারণ কোনও কারণে কম নমনীয় হয় (এটি ইনপুট অ্যারেগুলির মাত্রিকতা সম্পর্কে কঠোর এবং সংমিশ্রনের চেষ্টা করে) 1-ডি এটিকে কলাম হিসাবে বিবেচনা না করে শেষ-শেষ প্রান্তে থাকে)।

অবশেষে, 1-D অ্যারেগুলির উল্লম্ব স্ট্যাকিংয়ের নির্দিষ্ট ক্ষেত্রে, নিম্নলিখিতগুলিও কাজ করে:

numpy.array( LIST )

... কারণ অ্যারেগুলি অন্য অ্যারের ক্রম থেকে তৈরি করা যেতে পারে, শুরুতে একটি নতুন মাত্রা যুক্ত করে।


4
আমি মনে করি আউটপুট হিসাবে তিনি একটি 2 ডি অ্যারে চেয়েছিলেন।
গরুর মাংস

8

NumPy সংস্করণ 1.10 থেকে শুরু করে আমাদের কাছে পদ্ধতিটি স্ট্যাক রয়েছে । এটি যে কোনও মাত্রার অ্যারে স্ট্যাক করতে পারে (সমস্ত সমান):

# List of arrays.
L = [np.random.randn(5,4,2,5,1,2) for i in range(10)]

# Stack them using axis=0.
M = np.stack(L)
M.shape # == (10,5,4,2,5,1,2)
np.all(M == L) # == True

M = np.stack(L, axis=1)
M.shape # == (5,10,4,2,5,1,2)
np.all(M == L) # == False (Don't Panic)

# This are all true    
np.all(M[:,0,:] == L[0]) # == True
all(np.all(M[:,i,:] == L[i]) for i in range(10)) # == True

উপভোগ করুন,


1

গতির পারফরম্যান্সের জন্য আমি কয়েকটি পদ্ধতি পরীক্ষা করে দেখেছি যে কোনও পার্থক্য নেই! পার্থক্যটি হ'ল কিছু পদ্ধতি ব্যবহার করে আপনাকে অবশ্যই যত্ন সহকারে মাত্রা পরীক্ষা করতে হবে।

সময়:

|------------|----------------|-------------------|
|            | shape (10000)  |  shape (1,10000)  |
|------------|----------------|-------------------|
| np.concat  |    0.18280     |      0.17960      |
|------------|----------------|-------------------|
|  np.stack  |    0.21501     |      0.16465      |
|------------|----------------|-------------------|
| np.vstack  |    0.21501     |      0.17181      |
|------------|----------------|-------------------|
|  np.array  |    0.21656     |      0.16833      |
|------------|----------------|-------------------|

যেহেতু আপনি দেখতে পারেন আমি 2 পরীক্ষায় চেষ্টা করেছে - ব্যবহার np.random.rand(10000)এবং np.random.rand(1, 10000) এবং যদি আমরা চেয়ে 2d অ্যারে ব্যবহার np.stackএবং np.arrayঅতিরিক্ত মাত্রা তৈরি করুন - result.shape আছে (1,10000,10000) এবং (10000,1,10000) তাই তারা অতিরিক্ত ক্রিয়া প্রয়োজন এই এড়াতে ।

কোড:

from time import perf_counter
from tqdm import tqdm_notebook
import numpy as np
l = []
for i in tqdm_notebook(range(10000)):
    new_np = np.random.rand(10000)
    l.append(new_np)



start = perf_counter()
stack = np.stack(l, axis=0 )
print(f'np.stack: {perf_counter() - start:.5f}')

start = perf_counter()
vstack = np.vstack(l)
print(f'np.vstack: {perf_counter() - start:.5f}')

start = perf_counter()
wrap = np.array(l)
print(f'np.array: {perf_counter() - start:.5f}')

start = perf_counter()
l = [el.reshape(1,-1) for el in l]
conc = np.concatenate(l, axis=0 )
print(f'np.concatenate: {perf_counter() - start:.5f}')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.