ধরে নিন নিম্নলিখিত অ্যারে দেওয়া হয়েছে:
a = array([1,3,5])
b = array([2,4,6])
কীভাবে কেউ তাদের দক্ষতার সাথে অন্তর্বর্তী করবে যাতে একজন তৃতীয় অ্যারে পায় gets
c = array([1,2,3,4,5,6])
এটা ধরে নেওয়া যায় length(a)==length(b)
।
ধরে নিন নিম্নলিখিত অ্যারে দেওয়া হয়েছে:
a = array([1,3,5])
b = array([2,4,6])
কীভাবে কেউ তাদের দক্ষতার সাথে অন্তর্বর্তী করবে যাতে একজন তৃতীয় অ্যারে পায় gets
c = array([1,2,3,4,5,6])
এটা ধরে নেওয়া যায় length(a)==length(b)
।
উত্তর:
আমি জোশের উত্তর পছন্দ করি। আমি কেবল আরও সাধারণ, সামান্য এবং আরও কিছুটা ভারবস দ্রবণ যুক্ত করতে চেয়েছিলাম। কোনটি বেশি দক্ষ তা আমি জানি না। আমি আশা করি তাদের পারফরম্যান্স একই রকম হবে।
import numpy as np
a = np.array([1,3,5])
b = np.array([2,4,6])
c = np.empty((a.size + b.size,), dtype=a.dtype)
c[0::2] = a
c[1::2] = b
timeit
কোনও নির্দিষ্ট ক্রিয়াকলাপ যদি আপনার কোডের মধ্যে কোনও বাধা হয়ে থাকে তবে জিনিসগুলি পরীক্ষা করতে এটি ব্যবহার করা সর্বদা সার্থক । নম্পপিতে জিনিসগুলি করার জন্য একাধিক উপায় রয়েছে তবে অবশ্যই প্রোফাইল কোড স্নিপেটগুলি।
.reshape
অ্যারের অতিরিক্ত কপি তৈরি হয় তবে এটি 2x পারফরম্যান্স হিটকে ব্যাখ্যা করবে। তবে আমি মনে করি না এটি সর্বদা একটি অনুলিপি তৈরি করে। আমি অনুমান করছি 5x পার্থক্যটি কেবলমাত্র ছোট অ্যারেগুলির জন্য?
.flags
এবং পরীক্ষা .base
করে দেখে মনে হচ্ছে এটি 'এফ' ফর্ম্যাটের পুনর্নির্মাণটি vstacked ডেটার একটি গোপন অনুলিপি তৈরি করে, তাই এটি যেমন ভেবেছিল ঠিক ততটা সহজ নয়। এবং আশ্চর্যের বিষয় 5x কেবলমাত্র কোনও কারণে মধ্যবর্তী আকারের অ্যারেগুলির জন্য।
n
আইটেম সহ n-1
আইটেম বুনতে পারে ।
আমি ভেবেছিলাম যে পারফরম্যান্সের ক্ষেত্রে সমাধানগুলি কীভাবে সম্পাদন করেছে তা পরীক্ষা করা সার্থক হবে। এবং এই ফলাফল:
এটি পরিষ্কারভাবে দেখায় যে সর্বাধিক উত্সাহিত এবং গৃহীত উত্তর (পলস উত্তর ) ও দ্রুততম বিকল্প।
কোড অন্যান্য উত্তর থেকে এবং থেকে নিয়ে যাওয়া হয় অন্য Q & A- :
# Setup
import numpy as np
def Paul(a, b):
c = np.empty((a.size + b.size,), dtype=a.dtype)
c[0::2] = a
c[1::2] = b
return c
def JoshAdel(a, b):
return np.vstack((a,b)).reshape((-1,),order='F')
def xioxox(a, b):
return np.ravel(np.column_stack((a,b)))
def Benjamin(a, b):
return np.vstack((a,b)).ravel([-1])
def andersonvom(a, b):
return np.hstack( zip(a,b) )
def bhanukiran(a, b):
return np.dstack((a,b)).flatten()
def Tai(a, b):
return np.insert(b, obj=range(a.shape[0]), values=a)
def Will(a, b):
return np.ravel((a,b), order='F')
# Timing setup
timings = {Paul: [], JoshAdel: [], xioxox: [], Benjamin: [], andersonvom: [], bhanukiran: [], Tai: [], Will: []}
sizes = [2**i for i in range(1, 20, 2)]
# Timing
for size in sizes:
func_input1 = np.random.random(size=size)
func_input2 = np.random.random(size=size)
for func in timings:
res = %timeit -o func(func_input1, func_input2)
timings[func].append(res)
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure(1)
ax = plt.subplot(111)
for func in timings:
ax.plot(sizes,
[time.best for time in timings[func]],
label=func.__name__) # you could also use "func.__name__" here instead
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('size')
ax.set_ylabel('time [seconds]')
ax.grid(which='both')
ax.legend()
plt.tight_layout()
যদি আপনার কাছে নাম্বার উপলব্ধ থাকে তবে আপনি কোনও ফাংশন তৈরি করতে এটি ব্যবহার করতে পারেন:
import numba as nb
@nb.njit
def numba_interweave(arr1, arr2):
res = np.empty(arr1.size + arr2.size, dtype=arr1.dtype)
for idx, (item1, item2) in enumerate(zip(arr1, arr2)):
res[idx*2] = item1
res[idx*2+1] = item2
return res
অন্যান্য বিকল্পগুলির তুলনায় এটি কিছুটা দ্রুত হতে পারে:
roundrobin()
itertools রেসিপি থেকে।
এখানে একটি ওয়ান-লাইনার:
c = numpy.vstack((a,b)).reshape((-1,),order='F')
numpy.vstack((a,b)).interweave()
:)
.interleave()
ব্যক্তিগতভাবে ফাংশনটি
reshape
?
পূর্ববর্তী কয়েকটিগুলির তুলনায় এখানে একটি সহজ উত্তর
import numpy as np
a = np.array([1,3,5])
b = np.array([2,4,6])
inter = np.ravel(np.column_stack((a,b)))
এর পরে এটি inter
রয়েছে:
array([1, 2, 3, 4, 5, 6])
এই উত্তরটিও সামান্য দ্রুত বলে মনে হচ্ছে:
In [4]: %timeit np.ravel(np.column_stack((a,b)))
100000 loops, best of 3: 6.31 µs per loop
In [8]: %timeit np.ravel(np.dstack((a,b)))
100000 loops, best of 3: 7.14 µs per loop
In [11]: %timeit np.vstack((a,b)).ravel([-1])
100000 loops, best of 3: 7.08 µs per loop
এটি দুটি অ্যারে ইন্টারলিভ / ইন্টারলেস করবে এবং আমি বিশ্বাস করি এটি যথেষ্ট পঠনযোগ্য:
a = np.array([1,3,5]) #=> array([1, 3, 5])
b = np.array([2,4,6]) #=> array([2, 4, 6])
c = np.hstack( zip(a,b) ) #=> array([1, 2, 3, 4, 5, 6])
zip
একটি list
অবচয় সতর্কবার্তা এড়াতে
@ জোশএডেলের সমাধানের চেয়ে এটি আরও পঠনযোগ্য:
c = numpy.vstack((a,b)).ravel([-1])
ravel
এর order
মধ্যে যুক্তি ডকুমেন্টেশন অন্যতম C
, F
, A
, অথবা K
। আমি মনে করি আপনি সত্যিই চান .ravel('F')
ফরটার অর্ডার (প্রথম কলাম)
@ Xioxox এর উত্তরকে উন্নত করা:
import numpy as np
a = np.array([1,3,5])
b = np.array([2,4,6])
inter = np.ravel((a,b), order='F')
vstack
অবশ্যই একটি বিকল্প, তবে আপনার ক্ষেত্রে আরও সহজ সমাধান হতে পারে hstack
>>> a = array([1,3,5])
>>> b = array([2,4,6])
>>> hstack((a,b)) #remember it is a tuple of arrays that this function swallows in.
>>> array([1, 3, 5, 2, 4, 6])
>>> sort(hstack((a,b)))
>>> array([1, 2, 3, 4, 5, 6])
এবং আরও গুরুত্বপূর্ণভাবে এটি ইচ্ছামত আকার a
এবং এর জন্য কাজ করেb
এছাড়াও আপনি চেষ্টা করতে পারেন dstack
>>> a = array([1,3,5])
>>> b = array([2,4,6])
>>> dstack((a,b)).flatten()
>>> array([1, 2, 3, 4, 5, 6])
আপনার এখন বিকল্প আছে!
আমার এটি করার দরকার ছিল তবে যে কোনও অক্ষ বরাবর বহুমাত্রিক অ্যারে দিয়ে। এখানে সেই প্রভাবটির জন্য একটি সাধারণ সাধারণ উদ্দেশ্যে কাজ করা আছে। এটা তোলে হিসাবে একই কল স্বাক্ষর হয়েছে np.concatenate
ছাড়া সমস্ত ইনপুট অ্যারে থাকতে হবে যে ঠিক একই আকৃতি।
import numpy as np
def interleave(arrays, axis=0, out=None):
shape = list(np.asanyarray(arrays[0]).shape)
if axis < 0:
axis += len(shape)
assert 0 <= axis < len(shape), "'axis' is out of bounds"
if out is not None:
out = out.reshape(shape[:axis+1] + [len(arrays)] + shape[axis+1:])
shape[axis] = -1
return np.stack(arrays, axis=axis+1, out=out).reshape(shape)
out
alচ্ছিক আরোগুলি গ্রহণ করে এবং উপ-শ্রেণিবদ্ধ অ্যারেগুলির জন্য কাজ করে)। ব্যক্তিগতভাবে, আমি পছন্দ করিaxis
ডিফল্টকে না করে -1
বরং0
, তবে এটি কেবল আমারই। আর তুমি তোমার এই উত্তর লিংক থেকে করতে চাইবেন এই প্রশ্নের , যা আসলে ইনপুট অ্যারে এন-মাত্রিক হতে চাইলেন।
কেউ চেষ্টাও করতে পারে np.insert
। (সমাধান থেকে স্থানান্তরিত হয়েছে ইন্টারলেভ নাম্পার অ্যারেগুলি )
import numpy as np
a = np.array([1,3,5])
b = np.array([2,4,6])
np.insert(b, obj=range(a.shape[0]), values=a)
আরও তথ্যের জন্য documentation
এবং দয়া করে দেখুন tutorial
।