নম্পি - অ্যারেতে সারি যুক্ত করুন


161

কেউ কীভাবে একটি অদ্ভুত অ্যারে সারি যুক্ত করে?

আমার একটি অ্যারে আছে:

A = array([[0, 1, 2], [0, 2, 0]])

আমি এক্সে প্রতিটি সারির প্রথম উপাদানটি একটি নির্দিষ্ট শর্ত পূরণ করলে অন্য অ্যারে এক্স থেকে এই অ্যারেটিতে সারি যুক্ত করতে চাই।

নম্পি অ্যারে তালিকাগুলির মতো 'অ্যাপেন্ড' পদ্ধতি নেই বা তাই মনে হয়।

যদি ক এবং এক্স তালিকাগুলি থাকত তবে আমি কেবল করতাম:

for i in X:
    if i[0] < 3:
        A.append(i)

সমতুল্য করার কি কোনও নমপিথোনিক উপায় আছে?

ধন্যবাদ, এস ;-)


উত্তর:


120

কী X? যদি একটি 2 ডি-বিন্যস্ত হয়, কিভাবে আপনি তারপর তার সারি একটি সংখ্যা তুলনা করতে পারেন: i < 3?

ওপির মন্তব্যের পরে সম্পাদনা করুন:

A = array([[0, 1, 2], [0, 2, 0]])
X = array([[0, 1, 2], [1, 2, 0], [2, 1, 2], [3, 2, 0]])

Aসমস্ত সারিতে যোগ করুন Xযেখানে থেকে প্রথম উপাদান < 3:

import numpy as np
A = np.vstack((A, X[X[:,0] < 3]))

# returns: 
array([[0, 1, 2],
       [0, 2, 0],
       [0, 1, 2],
       [1, 2, 0],
       [2, 1, 2]])

1
দুঃখিত ভাল পয়েন্ট! একটি 2 ডি অ্যারে ধরে নিন যার মধ্যে প্রতিটি সারির প্রথম উপাদানটির একটি শর্ত পূরণ করতে হবে। আমি এটি সম্পাদনা করব। ধন্যবাদ, এস ;-)
ড্যারেন জে ফিত্জপ্যাট্রিক

2
@ ড্যারেনজে.ফিটজপ্যাট্রিক মনে রাখবেন যে এই ধরণের কারসাজি করে আপনি ভাল কাজের বিরুদ্ধে কাজ করেন নম্পি আপনার বিদ্যমান অ্যারের জন্য পূর্ব বরাদ্দ মেমরি করে A। স্পষ্টতই ছোট্ট সমস্যার জন্য যেমন এই উত্তরের মতো এটি কোনও সমস্যা নয়, তবে এটি বড় ডেটার জন্য আরও বেশি ঝামেলার হতে পারে।
dtlussier

166

ভাল আপনি এই করতে পারেন:

  newrow = [1,2,3]
  A = numpy.vstack([A, newrow])

2
@ ক্রিস এটি অবহিত করা হয় কেন? আমি কিছুই দেখতে ডক্স
Georgy

1
@ জর্জি সত্যি বলতে কি, আমি জানি না। আমি এখানে আপনার মতো উত্তরগুলি খুঁজছিলাম :-)। আমি কেন এখন উপরে মন্তব্য লিখেছিলাম তা মনে করতে পারছি না। আমি অবশ্যই দস্তাবেজগুলিতে এর অবনতিযুক্ত দেখেছি। কিন্তু এখন ডক্সের দিকে তাকানো ... এটি এমনটি বলে না। এগুলি কি তারা এটিকে অবমূল্যায়ন করে, তারপরে আবার তাদের মন পরিবর্তন করেছে এবং সিদ্ধান্ত নিয়েছে যে এটি অনেক লোকের কাছে এটিকে অবচয় করা এবং অপসারণ করা খুব বিরক্তিকর হবে?
ক্রিস

32

এই প্রশ্নটি যেমন 7 বছর আগের, আমি যে সর্বশেষ সংস্করণটি ব্যবহার করছি তা হ'ল নপি সংস্করণ 1.13 এবং পাইথন 3, আমি ম্যাট্রিক্সে একটি সারি যুক্ত করে একই জিনিসটি করছি, দ্বিতীয় যুক্তিতে একটি ডাবল বন্ধনী রেখে মনে রাখবেন , অন্যথায়, এটি মাত্রা ত্রুটি বাড়িয়ে তুলবে।

এখানে আমি ম্যাট্রিক্স এ যুক্ত করছি

1 2 3
4 5 6

এক সারি দিয়ে

7 8 9

একই ব্যবহার np.r_

A= [[1, 2, 3], [4, 5, 6]]
np.append(A, [[7, 8, 9]], axis=0)

    >> array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])
#or 
np.r_[A,[[7,8,9]]]

কারও কাছে ছেদ করা হয়েছে, যদি আপনি কোনও কলাম যুক্ত করতে চান,

array = np.c_[A,np.zeros(#A's row size)]

ম্যাট্রিক্স এ এর ​​আগে আমরা যা করেছি তা অনুসরণ করে এটিতে একটি কলাম যুক্ত করা হচ্ছে

np.c_[A, [2,8]]

>> array([[1, 2, 3, 2],
          [4, 5, 6, 8]])

10

আপনি এটি করতে পারেন:

newrow = [1,2,3]
A = numpy.concatenate((A,newrow))

2
Hmmm। যখন আমি এটি চেষ্টা করেছি, এটি ও এর অনুরোধ অনুযায়ী নতুন সারি যুক্ত করার চেয়ে এটি এর শেষের দিকে যুক্ত হয়েছে।
টড কারি

13
সম্ভবতnp.concatenate((A,newrow), axis=0)
কনস্টান্টিনোস রোডিটাকিস

3
অদ্ভুত সংস্করণ হিসাবে 1.12.1(এবং পাইথন 3 এ), মনে হচ্ছে ম্যাট্রিক্স উত্থাপনে কোনও ভেক্টরকে সংযুক্ত করার চেষ্টা করার মতো ValueError: all the input arrays must have same number of dimensions। দেখে মনে হচ্ছে এটি ভেক্টরকে একত্রিত করতে ইচ্ছুক হওয়ার আগে স্পষ্ট করে একটি কলাম বা সারি ভেক্টরটিতে পুনরায় আকার দিতে চায়।
MRule

3
আপনি ঠিক করতে পারবো @Flora পি জে লি থেকে উত্তর অনুযায়ী ডবল বর্গাকার বন্ধনী ব্যবহার করে @MRule stackoverflow.com/a/47845065/1410035newrow = [[1,2,3]]
টম সালিবা

10

যদি প্রতিটি সারির পরে কোনও গণনার প্রয়োজন হয় না, অজগরটিতে সারি যুক্ত করা আরও দ্রুত, তারপরে নম্পিতে রূপান্তরিত। এখানে পাইথন ৩.6 বনাম নম্পি ১.১৪ ব্যবহার করে টাইমিং পরীক্ষাগুলি দেওয়া হয়েছে, একবারে একটি করে 100 টি সারি যোগ করা:

import numpy as np 
from time import perf_counter, sleep

def time_it():
    # Compare performance of two methods for adding rows to numpy array
    py_array = [[0, 1, 2], [0, 2, 0]]
    py_row = [4, 5, 6]
    numpy_array = np.array(py_array)
    numpy_row = np.array([4,5,6])
    n_loops = 100

    start_clock = perf_counter()
    for count in range(0, n_loops):
       numpy_array = np.vstack([numpy_array, numpy_row]) # 5.8 micros
    duration = perf_counter() - start_clock
    print('numpy 1.14 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))

    start_clock = perf_counter()
    for count in range(0, n_loops):
        py_array.append(py_row) # .15 micros
    numpy_array = np.array(py_array) # 43.9 micros       
    duration = perf_counter() - start_clock
    print('python 3.6 takes {:.3f} micros per row'.format(duration * 1e6 / n_loops))
    sleep(15)

#time_it() prints:

numpy 1.14 takes 5.971 micros per row
python 3.6 takes 0.694 micros per row

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


5
import numpy as np
array_ = np.array([[1,2,3]])
add_row = np.array([[4,5,6]])

array_ = np.concatenate((array_, add_row), axis=0)

3

আপনি যদি একক অপারেশনে নির্মাণটি করতে পারেন তবে vstack- এর সাথে অভিনব-সূচকের উত্তরের মতো একটি সূক্ষ্ম পদ্ধতির approach তবে যদি আপনার অবস্থা আরও জটিল হয় বা আপনার সারিগুলি উড়ন্ত অবস্থায় আসে তবে আপনি অ্যারে বাড়তে চাইতে পারেন। প্রকৃতপক্ষে এরকম কিছু করার নামপিথোনিক উপায় - গতিশীলভাবে একটি অ্যারে বৃদ্ধি - একটি তালিকাটি গতিশীলভাবে বৃদ্ধি করা:

A = np.array([[1,2,3],[4,5,6]])
Alist = [r for r in A]
for i in range(100):
    newrow = np.arange(3)+i
    if i%5:
        Alist.append(newrow)
A = np.array(Alist)
del Alist

তালিকাগুলি এই ধরণের অ্যাক্সেস প্যাটার্নের জন্য অত্যন্ত অনুকূলিত হয়েছে; তালিকা ফর্মে থাকাকালীন আপনার কাছে সুবিধাজনক নম্পু বহুমাত্রিক ইনডেক্সিং নেই, তবে যতক্ষণ আপনি সংযোজন করছেন সারি অ্যারের তালিকার চেয়ে আরও ভাল কাজ করা শক্ত।


3

আমি 'এনপি.ভাস্ট্যাক' ব্যবহার করি যা দ্রুততর হয়, প্রাক্তন:

import numpy as np

input_array=np.array([1,2,3])
new_row= np.array([4,5,6])

new_array=np.vstack([input_array, new_row])

2

আপনি numpy.append()নিমপ্টি অ্যারেতে একটি সারি সংযোজন করতে পারেন এবং পরে কোনও ম্যাট্রিক্সে পুনরায় আকার দিতে পারেন।

import numpy as np
a = np.array([1,2])
a = np.append(a, [3,4])
print a
# [1,2,3,4]
# in your example
A = [1,2]
for row in X:
    A = np.append(A, row)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.