দুটি অলরেডি এন্টারয়েভ করা


84

ধরে নিন নিম্নলিখিত অ্যারে দেওয়া হয়েছে:

a = array([1,3,5])
b = array([2,4,6])

কীভাবে কেউ তাদের দক্ষতার সাথে অন্তর্বর্তী করবে যাতে একজন তৃতীয় অ্যারে পায় gets

c = array([1,2,3,4,5,6])

এটা ধরে নেওয়া যায় length(a)==length(b)


4
কীভাবে, একই প্রশ্ন, তবে আপনি ম্যাট্রিকগুলি ইন্টারলাইভ করার চেষ্টা করছেন। এটি a এবং b 3 টি মাত্রিক, এবং অগত্যা প্রথম মাত্রায় একই আকারের নয়। দ্রষ্টব্য: কেবলমাত্র প্রথম মাত্রাটি আন্তঃবিভক্ত হওয়া উচিত।
গেরোনিমো

উত্তর:


145

আমি জোশের উত্তর পছন্দ করি। আমি কেবল আরও সাধারণ, সামান্য এবং আরও কিছুটা ভারবস দ্রবণ যুক্ত করতে চেয়েছিলাম। কোনটি বেশি দক্ষ তা আমি জানি না। আমি আশা করি তাদের পারফরম্যান্স একই রকম হবে।

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

4
যদি গতি সত্যিই গুরুত্বপূর্ণ না হয়, আমি এটির সাথে চলে যাব কারণ এটি আরও বেশি বোধগম্য যা গুরুত্বপূর্ণ যদি কেউ আবারও এটির দিকে নজর রাখেন।
জন সালভাটিয়ার

6
+1 আমি সময় নিয়ে খেলেছি এবং আপনার কোডটি আশ্চর্যজনকভাবে ইনপুটগুলির উপর নির্ভর করে 2-5x দ্রুত বলে মনে হচ্ছে। আমি এখনও এই ধরণের অপারেশনগুলির দক্ষতা অদম্য বলে মনে করি, সুতরাং timeitকোনও নির্দিষ্ট ক্রিয়াকলাপ যদি আপনার কোডের মধ্যে কোনও বাধা হয়ে থাকে তবে জিনিসগুলি পরীক্ষা করতে এটি ব্যবহার করা সর্বদা সার্থক । নম্পপিতে জিনিসগুলি করার জন্য একাধিক উপায় রয়েছে তবে অবশ্যই প্রোফাইল কোড স্নিপেটগুলি।
জোশএডেল

@ জোশএডেল: আমার ধারণা, যদি .reshapeঅ্যারের অতিরিক্ত কপি তৈরি হয় তবে এটি 2x পারফরম্যান্স হিটকে ব্যাখ্যা করবে। তবে আমি মনে করি না এটি সর্বদা একটি অনুলিপি তৈরি করে। আমি অনুমান করছি 5x পার্থক্যটি কেবলমাত্র ছোট অ্যারেগুলির জন্য?
পল

আমার সমাধানটির দিকে তাকিয়ে .flagsএবং পরীক্ষা .baseকরে দেখে মনে হচ্ছে এটি 'এফ' ফর্ম্যাটের পুনর্নির্মাণটি vstacked ডেটার একটি গোপন অনুলিপি তৈরি করে, তাই এটি যেমন ভেবেছিল ঠিক ততটা সহজ নয়। এবং আশ্চর্যের বিষয় 5x কেবলমাত্র কোনও কারণে মধ্যবর্তী আকারের অ্যারেগুলির জন্য।
জোশআডেল

এই উত্তরের আর একটি সুবিধা হ'ল এটি একই দৈর্ঘ্যের অ্যারেগুলিতে সীমাবদ্ধ নয়। এটি nআইটেম সহ n-1আইটেম বুনতে পারে ।
এলিয়াদএল

63

আমি ভেবেছিলাম যে পারফরম্যান্সের ক্ষেত্রে সমাধানগুলি কীভাবে সম্পাদন করেছে তা পরীক্ষা করা সার্থক হবে। এবং এই ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

এটি পরিষ্কারভাবে দেখায় যে সর্বাধিক উত্সাহিত এবং গৃহীত উত্তর (পলস উত্তর ) ও দ্রুততম বিকল্প।

কোড অন্যান্য উত্তর থেকে এবং থেকে নিয়ে যাওয়া হয় অন্য 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

অন্যান্য বিকল্পগুলির তুলনায় এটি কিছুটা দ্রুত হতে পারে:

এখানে চিত্র বর্ণনা লিখুন


4
নোট এছাড়াও, গৃহীত উত্তর উপায় দ্রুত সঙ্গে একটি নেটিভ পাইথন সমাধান চেয়ে roundrobin()itertools রেসিপি থেকে।
ব্র্যাড সলোমন

42

এখানে একটি ওয়ান-লাইনার:

c = numpy.vstack((a,b)).reshape((-1,),order='F')

17
বাহ, এটি এতটা অপঠনযোগ্য :) এটি এমন একটি ক্ষেত্রে যেখানে আপনি কোডটিতে সঠিক মন্তব্য না লিখলে এটি কাউকে পাগল করে তুলতে পারে।
ইলিয়া কোগান 1

10
এটি কেবল দুটি সাধারণ নম্পি কমান্ড একসাথে জড়িত। আমি মনে করি না যে এটি অপঠনযোগ্য, যদিও কোনও মন্তব্য কখনও আঘাত করে না।
জোশআডেল

4
@ জন অ্যাডেল, ভাল, এটি নয় numpy.vstack((a,b)).interweave():)
ইলিয়া কোগান

6
@ ইলিয়া: আমি .interleave()ব্যক্তিগতভাবে ফাংশনটি
ডাকতাম

কি করে reshape?
দানিজেল

23

পূর্ববর্তী কয়েকটিগুলির তুলনায় এখানে একটি সহজ উত্তর

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

10

এটি দুটি অ্যারে ইন্টারলিভ / ইন্টারলেস করবে এবং আমি বিশ্বাস করি এটি যথেষ্ট পঠনযোগ্য:

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])

4
আমি এটি সবচেয়ে পাঠযোগ্য হিসাবে পছন্দ করি। এটি সবচেয়ে ধীর সমাধান হওয়া সত্ত্বেও।
কিমস্টিক

মোড়ানো zipএকটি listঅবচয় সতর্কবার্তা এড়াতে
মাইলো Wielondek

6

@ জোশএডেলের সমাধানের চেয়ে এটি আরও পঠনযোগ্য:

c = numpy.vstack((a,b)).ravel([-1])

4
ravelএর orderমধ্যে যুক্তি ডকুমেন্টেশন অন্যতম C, F, A, অথবা K। আমি মনে করি আপনি সত্যিই চান .ravel('F')ফরটার অর্ডার (প্রথম কলাম)
নিক টি


1

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])

আপনার এখন বিকল্প আছে!


7
-1 প্রথম উত্তর দিতে কারণ প্রশ্নের বাছাইয়ের সাথে কোনও সম্পর্ক নেই। +1 এর দ্বিতীয় উত্তর, যা আমি এখনও অবধি দেখেছি। একারণে একাধিক সমাধান একাধিক উত্তর হিসাবে পোস্ট করা উচিত। দয়া করে এটিকে একাধিক উত্তরে ভাগ করুন।
এন্ডোলিথ

1

আমার এটি করার দরকার ছিল তবে যে কোনও অক্ষ বরাবর বহুমাত্রিক অ্যারে দিয়ে। এখানে সেই প্রভাবটির জন্য একটি সাধারণ সাধারণ উদ্দেশ্যে কাজ করা আছে। এটা তোলে হিসাবে একই কল স্বাক্ষর হয়েছে 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)

এ জাতীয় সাধারণ রেসিপিটির জন্য +1 (এন-ম্লাদের সাথে কাজ করে, যে কোনও অক্ষ বরাবর ইন্টারলিভগুলি কাজ করে, বহু সংখ্যক ইনপুট অ্যারে ব্যবহার করে, একটি outalচ্ছিক আরোগুলি গ্রহণ করে এবং উপ-শ্রেণিবদ্ধ অ্যারেগুলির জন্য কাজ করে)। ব্যক্তিগতভাবে, আমি পছন্দ করিaxis ডিফল্টকে না করে -1বরং0 , তবে এটি কেবল আমারই। আর তুমি তোমার এই উত্তর লিংক থেকে করতে চাইবেন এই প্রশ্নের , যা আসলে ইনপুট অ্যারে এন-মাত্রিক হতে চাইলেন।
ফাউন্টেনহেড

1

আরেকটি ওয়ান-লাইনার: np.vstack((a,b)).T.ravel()
আরও একটি:np.stack((a,b),1).ravel()


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

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