2 ডি অ্যারেতে কলাম প্রতি দ্বিতীয় সর্বনিম্ন মান পান


15

আমি কীভাবে প্রতিটি কলাম থেকে দ্বিতীয় সর্বনিম্ন মান পেতে পারি? আমার এই অ্যারে আছে:

A = [[72 76 44 62 81 31]
     [54 36 82 71 40 45]
     [63 59 84 36 34 51]
     [58 53 59 22 77 64]
     [35 77 60 76 57 44]]

আমি যেমন আউটপুট পেতে চান:

A = [54 53 59 36 40 44]

তুমি কি কিছু চেষ্টা করেছ? ?
মেহা পারেখ

দ্বিতীয় কলামে ন্যূনতম ?
নিকোলাস গ্রাভেইস

@ নিকোলাসগ্রায়েস হ্যাঁ
মিস্টার ড্যান

উত্তর:


12

এটি কেবল একটি লাইনে চেষ্টা করুন:

[sorted(i)[1] for i in zip(*A)]

কর্মে:

In [12]: A = [[72, 76, 44, 62, 81, 31], 
    ...:      [54 ,36 ,82 ,71 ,40, 45], 
    ...:      [63 ,59, 84, 36, 34 ,51], 
    ...:      [58, 53, 59, 22, 77 ,64], 
    ...:      [35 ,77, 60, 76, 57, 44]] 

In [18]: [sorted(i)[1] for i in zip(*A)]                                                                                                                                                                           
Out[18]: [54, 53, 59, 36, 40, 44]

zip(*A) আপনার তালিকার তালিকাটি স্থানান্তর করবে যাতে কলামগুলি সারি হয়ে যায়।

এবং যদি আপনার সদৃশ মান থাকে তবে উদাহরণস্বরূপ:

In [19]: A = [[72, 76, 44, 62, 81, 31], 
    ...:  [54 ,36 ,82 ,71 ,40, 45], 
    ...:  [63 ,59, 84, 36, 34 ,51], 
    ...:  [35, 53, 59, 22, 77 ,64],   # 35
    ...:  [35 ,77, 50, 76, 57, 44],]  # 35

আপনার যদি উভয়ই এড়িয়ে যেতে হয় তবে 35আপনি এটি ব্যবহার করতে পারেন set():

In [29]: [sorted(list(set(i)))[1] for i in zip(*A)]                                                                                                                                                                
Out[29]: [54, 53, 50, 36, 40, 44]

6

numpyঅ্যারেগুলিতে অপারেশনগুলি numpyফাংশন দিয়ে করা উচিত , সুতরাং এটি দেখুন:

np.sort(A, axis=0)[1, :]
Out[61]: array([54, 53, 59, 36, 40, 44])

যতদূর আমি জানি এটি সর্বোত্তম সমাধান হতে হবে, এটি সবকিছুকে রাখে numpy, আমি মনে করি সমাধান lambdaঅবশ্যই কমিয়ে আনতে হবে heapq.nsmallest। সবকিছু দ্রুত রাখা ভাল মনে হয়numpy
জামিলাক

3

আপনি heapq.nsmallest ব্যবহার করতে পারেন

from heapq import nsmallest

[nsmallest(2, e)[-1] for e in zip(*A)]

আউটপুট:

[54, 53, 50, 36, 40, 44]

আমি ইতিমধ্যে পোস্ট করা বিভিন্ন সমাধানগুলির পারফরম্যান্সের তুলনা করার জন্য একটি সাধারণ বেঞ্চমার্ক যুক্ত করেছি:

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

from simple_benchmark import BenchmarkBuilder
from heapq import nsmallest


b = BenchmarkBuilder()

@b.add_function()
def MehrdadPedramfar(A):
    return [sorted(i)[1] for i in zip(*A)]

@b.add_function()
def NicolasGervais(A):
    return np.sort(A, axis=0)[1, :]

@b.add_function()
def imcrazeegamerr(A):
    rotated = zip(*A[::-1])

    result = []
    for arr in rotated:
        # sort each 1d array from min to max
        arr = sorted(list(arr))
        # add the second minimum value to result array
        result.append(arr[1])

    return result

@b.add_function()
def Daweo(A):
    return np.apply_along_axis(lambda x:heapq.nsmallest(2,x)[-1], 0, A)

@b.add_function()       
def kederrac(A):
    return [nsmallest(2, e)[-1] for e in zip(*A)]


@b.add_arguments('Number of row/cols (A is  square matrix)')
def argument_provider():
    for exp in range(2, 18):
        size = 2**exp
        yield size, [[randint(0, 1000) for _ in range(size)] for _ in range(size)]

r = b.run()
r.plot()

বড় 2 ডি তালিকার সেরা হতে শোয়ের সাথে ব্যবহার করার সময় ফাংশন zipসহ ব্যবহার করা sortedছোট 2 ডি তালিকার দ্রুততম সমাধানzipheapq.nsmallest


1
কেবল একটি বন্য চিন্তাধারা: এই ফলাফলগুলি কী এমন প্রভাব ফেলতে পারে যে আপনি যে সংখ্যাগুলি ছাঁটাইয়ের মতো নয়? এছাড়াও, বিল্ট ইন র্যান্ডেন্ট কোনও অ্যারের পরিবর্তে কোনও তালিকা ফেরত দেবে না?
নিকোলাস গ্রাভেইস

1

আমি আশা করি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পেরেছি তবে যে কোনও উপায়েই আমার সমাধান এখানে রয়েছে, আমি নিশ্চিত যে এটি করার আরও একটি সুস্পষ্ট উপায় আছে তবে এটি কার্যকর

A = [[72,76,44,62,81,31]
 ,[54,36,82,71,40,45]
 ,[63,59,84,36,34,51]
 ,[58,53,59,22,77,64]
 ,[35,77,50,76,57,44]]

#rotate the array 90deg
rotated = zip(*A[::-1])

result = []
for arr in rotated:
    # sort each 1d array from min to max
    arr = sorted(list(arr))
    # add the second minimum value to result array
    result.append(arr[1])
print(result)

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


0

Assuming যে Aহয় numpy.array(যদি এই কথা সত্য যোগ বিবেচনা করুন numpyআপনার প্রশ্নের ট্যাগ) তারপর আপনি ব্যবহার করতে পারেন apply_along_axisযেটা নিম্নে দেওয়া উপায়:

import heap
import numpy as np
A = np.array([[72, 76, 44, 62, 81, 31],
              [54, 36, 82, 71, 40, 45],
              [63, 59, 84, 36, 34, 51],
              [58, 53, 59, 22, 77, 64],
              [35, 77, 60, 76, 57, 44]])
second_mins = np.apply_along_axis(lambda x:heapq.nsmallest(2,x)[-1], 0, A)
print(second_mins)  # [54 53 59 36 40 44]

নোট করুন যে আমি 2 হ'ল এলিমেন্ট পাওয়ার জন্য যতটা বাছাই করে ততটা হ্যাপাক্স.মনলস্টেস্ট ব্যবহার করেছি , এর বিপরীতে sortedসম্পূর্ণরূপে বাছাই হয় না।


0
>>> A = np.arange(30).reshape(5,6).tolist()
>>> A
[[0, 1, 2, 3, 4, 5], 
 [6, 7, 8, 9, 10, 11], 
 [12, 13, 14, 15, 16, 17], 
 [18, 19, 20, 21, 22, 23],
 [24, 25, 26, 27, 28, 29]]

আপডেট হয়েছে : ব্যবহার setকরে নকল এবং প্রতিস্থাপনের তালিকা রোধ করতে ব্যবহার করুনzip(*A)

>>> [sorted(set(items))[1] for items in zip(*A)]
[6, 7, 8, 9, 10, 11]

পুরানো: প্রতিটি সারিতে দ্বিতীয় সর্বনিম্ন আইটেম

>>> [sorted(set(items))[1] for items in A]
[1, 7, 13, 19, 25]

এটি কি কলামের পরিবর্তে প্রতিটি সারিতে দ্বিতীয় আইটেম পাচ্ছে না?
পাক্সদিবলো

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