দুটি এক-মাত্রিক NumPy অ্যারে সংমিশ্রণ


266

নুমপাইতে আমার কাছে দুটি সাধারণ এক-মাত্রিক অ্যারে রয়েছে । আমি numpy.concateate ব্যবহার করে সেগুলি বোঝাতে সক্ষম হব । তবে আমি নীচের কোডটির জন্য এই ত্রুটিটি পেয়েছি:

প্রকারের ত্রুটি: কেবল দৈর্ঘ্য -1 অ্যারে পাইথন স্কেলারে রূপান্তরিত হতে পারে

কোড

import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)

কেন?


আপনি যদি একটি অক্ষ বরাবর এগুলি (একক অ্যারেতে) যুক্ত করতে চান তবে ব্যবহার করুন np.concatenat(..., axis)। আপনি যদি এগুলি উল্লম্বভাবে স্ট্যাক করতে চান তবে ব্যবহার করুন np.vstack। আপনি যদি তাদের আনুভূমিকভাবে (একাধিক অ্যারেতে) স্ট্যাক করতে চান তবে ব্যবহার করুন np.hstack। (আপনি যদি তাদের গভীরতা অনুসারে স্ট্যাক করতে চান, তৃতীয় তৃতীয় মাত্রা, ব্যবহার করুন np.dstack)। মনে রাখবেন যে pd.concat
আধুনিকগুলি পান্ডাসের

উত্তর:


372

লাইনটি হওয়া উচিত:

numpy.concatenate([a,b])

আপনি যে অ্যারে যুক্ত করতে চান সেগুলি পৃথক যুক্তি হিসাবে নয়, ক্রম হিসাবে পাস করা দরকার।

থেকে NumPy ডকুমেন্টেশন :

numpy.concatenate((a1, a2, ...), axis=0)

একসাথে অ্যারে একটি ক্রম যোগদান।

এটি আপনার bঅক্ষ প্যারামিটার হিসাবে ব্যাখ্যা করার চেষ্টা করছিল , এই কারণেই এটি অভিযোগ করে যে এটি এটিকে স্কেলারে রূপান্তর করতে পারে না।


1
ধন্যবাদ! শুধু কৌতূহলী - এর পিছনে যুক্তি কী?
ব্যবহারকারী 39131339

8
@ ব্যবহারকারী 39131339, আপনি যদি তিনটি অ্যারে সংযুক্ত করতে চান? ক্রিয়াকলাপটি সিকোয়েন্স গ্রহণে আরও কার্যকর যদি এটি কেবল দুটি অ্যারে নেয়।
উইনস্টন ইওয়ার্ট

@ উইনস্টনওয়ার্ট বিষয়টি ধরেই নিচ্ছেন না যে এটি দুটি যুক্তিই হার্ডকোডযুক্ত, আপনি এটি পছন্দ মতো ব্যবহার করতে পারেন numpy.concatenate(a1, a2, a3)বা numpy.concatenate(*[a1, a2, a3])যদি আপনি চান। পাইথনের তরল যথেষ্ট পরিমাণে যে পার্থক্যটি যথেষ্ট পরিমাণের চেয়ে বেশি প্রসাধনী বোধ বোধ করে, তবে এপিআই সামঞ্জস্যপূর্ণ হলে এটি ভাল (যেমন ভেরিয়েবলের দৈর্ঘ্যের আর্গুমেন্ট তালিকার সমস্ত অকার্যকর ফাংশনগুলি সুস্পষ্ট ক্রমগুলির প্রয়োজন হয়)।
জিম কে।

@JimK। অক্ষ পরামিতি কি হবে?
উইনস্টন ইওয়ার্ট

1
বিষয়গুলি একত্রিত করার বিষয়টি ধরে নিলে সমস্ত অবস্থানগত পরামিতি হয়, আপনি অক্ষকে কীওয়ার্ড আর্গুমেন্ট হিসাবে রাখতে পারেন def concatx(*sequences, **kwargs)) এটি আদর্শ নয় যেহেতু আপনি স্বাক্ষরটিতে কীওয়ার্ড আরগগুলি সুস্পষ্টভাবে এইভাবে নাম লেখাতে পারেন না, তবে কার্যকারণ রয়েছে।
জিম কে।

37

1D অ্যারে সংবর্ধনা করার বিভিন্ন সম্ভাবনা রয়েছে, যেমন,

numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.concatenate([a, a])

এই সমস্ত বিকল্প বড় অ্যারেগুলির জন্য সমান দ্রুত; ছোটদের জন্য, concatenateএকটি সামান্য প্রান্ত রয়েছে:

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

প্লটটি পারফ্লোট দিয়ে তৈরি করা হয়েছিল :

import numpy
import perfplot

perfplot.show(
    setup=lambda n: numpy.random.rand(n),
    kernels=[
        lambda a: numpy.r_[a, a],
        lambda a: numpy.stack([a, a]).reshape(-1),
        lambda a: numpy.hstack([a, a]),
        lambda a: numpy.concatenate([a, a]),
    ],
    labels=["r_", "stack+reshape", "hstack", "concatenate"],
    n_range=[2 ** k for k in range(19)],
    xlabel="len(a)",
)

9
বিকল্প সমস্ত ব্যবহার np.concatenate। তারা হাতের আগে বিভিন্ন উপায়ে কেবল ইনপুট তালিকাটি ম্যাসেজ করে। np.stackউদাহরণস্বরূপ সমস্ত ইনপুট অ্যারেগুলিতে একটি অতিরিক্ত মাত্রা যুক্ত করে। তাদের উত্স কোড দেখুন। শুধুমাত্র concatenateসংকলিত হয়।
hpaulj

1
কেবলমাত্র @hpaulj এর মন্তব্যে যোগ করতে - অ্যারের আকার বাড়ার সাথে সাথে সমস্তগুলি একসাথে পরিণত হয় কারণ np.concatenateইনপুটগুলির অনুলিপিগুলি তৈরি করে। এই মেমোরি এবং সময় ব্যয় তখন ইনপুট 'ম্যাসেজ' করার সময়কে ছাড়িয়ে যায়।
n1k31t4

31

প্রথম প্যারামিটারটি concatenateনিজেই বিন্যাসের জন্য অ্যারেগুলির ক্রম হওয়া উচিত :

numpy.concatenate((a,b)) # Note the extra parentheses.

10

"কনটেনেট" এর সংক্ষিপ্ত রূপটি ব্যবহার করার বিকল্প বিকল্প যা "আর _ [...]" বা "সি _ [...]" নীচের উদাহরণ কোডে দেখানো হয়েছে (দেখুন http://wiki.scipy.org / অতিরিক্ত তথ্যের জন্য নুমপি_ফ_মাতলাব_ ব্যবহারকারীরা :

%pylab
vector_a = r_[0.:10.] #short form of "arange"
vector_b = array([1,1,1,1])
vector_c = r_[vector_a,vector_b]
print vector_a
print vector_b
print vector_c, '\n\n'

a = ones((3,4))*4
print a, '\n'
c = array([1,1,1])
b = c_[a,c]
print b, '\n\n'

a = ones((4,3))*4
print a, '\n'
c = array([[1,1,1]])
b = r_[a,c]
print b

print type(vector_b)

যার ফলাফল:

[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.]
[1 1 1 1]
[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9.  1.  1.  1.  1.] 


[[ 4.  4.  4.  4.]
 [ 4.  4.  4.  4.]
 [ 4.  4.  4.  4.]] 

[[ 4.  4.  4.  4.  1.]
 [ 4.  4.  4.  4.  1.]
 [ 4.  4.  4.  4.  1.]] 


[[ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 4.  4.  4.]] 

[[ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 4.  4.  4.]
 [ 1.  1.  1.]]

2
vector_b = [1,1,1,1] #short form of "array", এই কেবল সত্য নয়. ভেক্টর_বি স্ট্যান্ডার্ড পাইথন তালিকার ধরণ হবে। নম্পি তবে সমস্ত ইনপুটকে নাম্পায়.আররে টাইপ করতে বাধ্য করার পরিবর্তে সিকোয়েন্স গ্রহণ করতে বেশ ভাল।
হ্যানস ওভ্রন

2
আপনি ঠিক বলেছেন - আমি ভুল ছিল। আমি আমার উত্স কোডটি পাশাপাশি ফলাফল সংশোধন করেছি।
সেমজান ম্যাসিংগার

0

এখানে আরো ব্যবহার করে এই কাজ করার জন্য পন্থা numpy.ravel(), numpy.array(), আসলে ব্যবহার 1D অ্যারে প্লেইন উপাদান মধ্যে প্যাক না হতে পারে যে:

# we'll utilize the concept of unpacking
In [15]: (*a, *b)
Out[15]: (1, 2, 3, 5, 6)

# using `numpy.ravel()`
In [14]: np.ravel((*a, *b))
Out[14]: array([1, 2, 3, 5, 6])

# wrap the unpacked elements in `numpy.array()`
In [16]: np.array((*a, *b))
Out[16]: array([1, 2, 3, 5, 6])

0

নোংরা ডক্স থেকে আরও কিছু তথ্য :

হিসাবে সিনট্যাক্স সহ numpy.concatenate((a1, a2, ...), axis=0, out=None)

অক্ষ = 0 সারি-অনুসারে সূক্ষ্ম অক্ষরের জন্য = 1 কলাম-অনুসারে সূক্ষ্ম সূচনার জন্য

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

# Appending below last row
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])

# Appending after last column
>>> np.concatenate((a, b.T), axis=1)    # Notice the transpose
array([[1, 2, 5],
       [3, 4, 6]])

# Flattening the final array
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

আমি আসা করি এটা সাহায্য করবে !

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