সজ্জা বিন্যাসে সারি মুছে ফেলা হচ্ছে


90

আমার কাছে এমন একটি অ্যারে রয়েছে যা দেখতে দেখতে এটি দেখতে পারে:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

লক্ষ্য করুন যে সারিগুলির একটির শেষে একটি শূন্য মান রয়েছে। সমস্ত কোষে শূন্যহীন মানযুক্ত যে কোনও সারি রাখার সময় আমি একটি শূন্যযুক্ত যে কোনও সারি মুছতে চাই।

কিন্তু অ্যারেতে প্রতিবার জনসংখ্যাযুক্ত হওয়ার সাথে সাথে বিভিন্ন সংখ্যক সারি থাকবে এবং প্রতিবার শূন্যগুলি বিভিন্ন সারিতে অবস্থান করবে।

নিম্নলিখিত কোডের লাইন দিয়ে আমি প্রতিটি সারিতে অ-শূন্য উপাদানের সংখ্যা পেয়েছি:

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

উপরের অ্যারের জন্য, NumNonzeroElementsInRowsরয়েছে: [5 4]

পাঁচটি ইঙ্গিত দেয় যে সারি 0-এর সমস্ত সম্ভাব্য মান ননজারো, যখন চারটি নির্দেশ করে যে সারি 1 এর সম্ভাব্য মানগুলির মধ্যে একটি শূন্য।

অতএব, আমি শূন্য মান সহ সারিগুলি সন্ধান এবং মুছতে নিম্নলিখিত কোডের লাইনগুলি ব্যবহার করার চেষ্টা করছি।

for q in range(len(NumNonzeroElementsInRows)):
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
        p.delete(ANOVAInputMatrixValuesArray, q, axis=0)

তবে কিছু কারণে, এই কোডটি কিছু করতে পারে বলে মনে হচ্ছে না, যদিও প্রচুর মুদ্রণ কমান্ড করা ইঙ্গিত দেয় যে সমস্ত ভেরিয়েবলগুলি সঠিকভাবে কোডের দিকে এগিয়ে চলেছে বলে মনে হচ্ছে।

"শূন্যের মান ধারণ করে এমন কোনও সারি মুছে ফেলতে অবশ্যই কিছু সহজ উপায় থাকতে হবে।"

এটি সম্পাদন করতে কি কোড আমাকে লিখতে পারেন?

উত্তর:


166

অ্যারে থেকে সারি এবং কলামগুলি মুছে ফেলার সহজ উপায় হ'ল numpy.deleteপদ্ধতি।

ধরুন আমার কাছে নিম্নলিখিত অ্যারে রয়েছে x:

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])

প্রথম সারিটি মুছতে, এটি করুন:

x = numpy.delete(x, (0), axis=0)

তৃতীয় কলামটি মুছতে, এটি করুন:

x = numpy.delete(x,(2), axis=1)

সুতরাং আপনি সারিগুলির সূচকগুলি খুঁজে পেতে পারেন যার মধ্যে একটি 0 রয়েছে, তাদের একটি তালিকা বা একটি টুপলে রাখুন এবং এটি ফাংশনের দ্বিতীয় আর্গুমেন্ট হিসাবে পাস করুন।


ধন্যবাদ! আমারও একই সমস্যা ছিল এবং কেবল কল করা কেন numpy.delete(x, index)কাজ করে না তা আমি বুঝতে পারি না।
এন্টিমোনি

6
দয়া করে মনে রাখবেন মুছতে numpy () ডক্স নির্দেশ করে যে একটি নতুন অ্যারে থেকে ফিরিয়ে দেওয়া হয় "প্রায়ই এটি একটি বুলিয়ান মাস্ক ব্যবহার বাঞ্ছনীয়" - একটি উদাহরণ অধীনে যে লিঙ্ক প্রদান করা হয়
arturomp

4
@ আর্টুরম্প কিন্তু মুখোশটি উত্তরহীন। () সময় / স্মৃতি গ্রহন করার জন্য কি কোনও কল রয়েছে?
নাথান

14

এখানে একটি লাইনার রয়েছে (হ্যাঁ, এটি ব্যবহারকারীর মতো 33৩3737০০ এর মতো, তবে আরও কিছুটা সোজা):

>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], 
                [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889,  0.73641667,  0.67521429,  0.592875  ,  0.53172222]])

যাইহোক, এই পদ্ধতিটি বড় ম্যাট্রিক্সের জন্য মুখোশযুক্ত অ্যারে পদ্ধতির চেয়ে অনেক বেশি দ্রুত। 2048 x 5 ম্যাট্রিক্সের জন্য, এই পদ্ধতিটি প্রায় 1000x দ্রুত।

যাইহোক, ব্যবহারকারীর 333700 এর পদ্ধতি (তার মন্তব্য থেকে) আমার পরীক্ষাগুলিতে কিছুটা দ্রুত ছিল, যদিও এটি আমার মনকে বোকা করে।


4
"যে কোনও" শর্ট সার্কিট করতে পারে, প্রথম সত্যিকারের কেসটি সনাক্ত হওয়ার সাথে সাথে এটি বন্ধ হয়ে যেতে পারে, যখন "সমস্ত" সমস্ত শর্ত পরীক্ষা করতে হয়। সুতরাং, (নম্রিতে "~" নয়) সাধারণভাবে সবার চেয়ে দ্রুত হওয়া উচিত।
জোসেফ

4
@ ব্যবহারকারী ৩৩3737০০, উভয়ই শর্ট সার্কিট করতে পারবেন, কেবল বিভিন্ন জিনিস। anyপ্রথম সত্য ক্ষেত্রে সত্য থেকে শর্ট সার্কিট সনাক্ত; allশর্ট সার্কিটগুলি মিথ্যা থেকে প্রথম মিথ্যা ক্ষেত্রে সনাক্ত হয়েছে। এই ক্ষেত্রে, শর্ট সার্কিটটি ড্র হওয়া উচিত, তবে অতিরিক্ত না করা আমার মতে এটি ধীর হওয়া উচিত।
জাস্টিন পিল

5

এটি আপনার আসল পদ্ধতির অনুরূপ, এবং আনটবুর উত্তরের চেয়ে কম জায়গা ব্যবহার করবে , তবে আমার ধারণা এটি ধীর হবে।

>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5,  0. ],
       [ 1.4,  1.5],
       [ 1.6,  0. ],
       [ 1.7,  1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4,  1.5],
       [ 1.7,  1.8]])

যাইহোক, আপনার লাইনটি p.delete()আমার পক্ষে কাজ করে না - ndarrayএর কোনও .deleteবৈশিষ্ট্য নেই।


8
কিছুটা সহজ: পি [~ (পি == 0)। কোনও (1)] বা সারিগুলির জন্য আরও সুস্পষ্ট: পি [~ (পি == 0) .আর (1),:]
জোসেফ

2

নম্পি ঠিক একই কাজটি করার জন্য একটি সাধারণ ফাংশন সরবরাহ করে: মনে করুন যে আপনার কাছে একটি মুখোশযুক্ত অ্যারে রয়েছে 'এ', numpy.ma.compress_rows (ক) কে একটি মুখোশযুক্ত মান যুক্ত সারিগুলি মুছে ফেলবে। আমার ধারণা এটি এইভাবে অনেক দ্রুত ...


1
import numpy as np 
arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
print(arr[np.where(arr != 0.)])

-1

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

indx = []
for i in range(len(ANOVA)):
    if int(ANOVA[i,4]) == int(0):
        indx.append(i)

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