একটি ভেক্টরের শেষ এন উপাদানগুলি পাওয়া। দৈর্ঘ্য () ফাংশনটি ব্যবহার করার চেয়ে আরও ভাল উপায় কি আছে?


86

যদি যুক্তির পক্ষে, আমি পাইথনের 10-দৈর্ঘ্যের ভেক্টরের শেষ পাঁচটি উপাদান চাই, তবে আমি পরিসীমা সূচকগুলিতে "-" অপারেটরটি ব্যবহার করতে পারি:

>>> x = range(10)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[-5:]
[5, 6, 7, 8, 9]
>>>

আর-তে এটি করার সর্বোত্তম উপায় কী? দৈর্ঘ্য () ফাংশনটি ব্যবহার করার জন্য আমার বর্তমান কৌশলটির চেয়ে কি আরও পরিষ্কার উপায় আছে?

> x <- 0:9
> x
 [1] 0 1 2 3 4 5 6 7 8 9
> x[(length(x) - 4):length(x)]
[1] 5 6 7 8 9
> 

প্রশ্নটি টাইম সিরিজ বিশ্লেষণ বিটিডব্লিউয়ের সাথে সম্পর্কিত যেখানে কেবলমাত্র সাম্প্রতিক ডেটাগুলিতে প্রায়শই কাজ করা কার্যকর।

উত্তর:


123

দেখুন ?tailএবং ?headকিছু সুবিধাজনক ফাংশন জন্য:

> x <- 1:10
> tail(x,5)
[1]  6  7  8  9 10

যুক্তির স্বার্থে: শেষ পাঁচটি উপাদান বাদে সমস্ত কিছু হ'ল:

> head(x,n=-5)
[1] 1 2 3 4 5

@ মার্টিন মরগান মন্তব্যে যেমন বলেছে, অন্য দুটি সম্ভাবনা রয়েছে যা লেজ সমাধানের চেয়ে দ্রুততর হয়, যদি আপনি এটি 100 মিলিয়ন মূল্যবোধের ভেক্টরের উপর এক মিলিয়ন বার চালিয়ে যেতে পারেন। পাঠযোগ্যতার জন্য, আমি লেজের সাথে যাব।

test                                        elapsed    relative 
tail(x, 5)                                    38.70     5.724852     
x[length(x) - (4:0)]                           6.76     1.000000     
x[seq.int(to = length(x), length.out = 5)]     7.53     1.113905     

মানদণ্ডের কোড:

require(rbenchmark)
x <- 1:1e8
do.call(
  benchmark,
  c(list(
    expression(tail(x,5)),
    expression(x[seq.int(to=length(x), length.out=5)]),
    expression(x[length(x)-(4:0)])
  ),  replications=1e6)
)

তবে কাটানোর চেয়ে দ্রুত নয় - টেস্টিং এটিকে বহন করে।
নিক বেস্টিন

4
ধন্যবাদ নিক আকর্ষণীয়। হ্যাঁ পাইথন স্লাইসিং ভাষাটির একটি দুর্দান্ত বৈশিষ্ট্য।
টমাস ব্রাউন

4
@ নিক: আসলেই। দৈর্ঘ্য 1e6 এবং 1000 প্রতিরূপের ভেক্টরে, এটি প্রায় 0.3 সেকেন্ড ধীর er আপনি যে 0.3 সেকেন্ডটি সঞ্চয় করেছেন সেগুলি দিয়ে আপনি কী করতে পারেন তা কল্পনা করুন ...
জরিস মেজ

6
ব্যবহারসমূহের ::: লেজ.ডিফল্টের বাস্তবায়ন x[seq.int(to=length(x), length.out=5)]যা tail()স্যানিটি চেক ছাড়াই প্রায় 10x দ্রুত বলে মনে হচ্ছে ; x[length(x)-(4:0)]দ্রুত এখনও।
মার্টিন মরগ্যান

4
@ জরিস: আমি ভাবতে পারি যে আমি একটি বিলিয়ন বার অভ্যন্তরীণ লুপে এই বিশেষ ক্রিয়াকলাপটি চালানোর পরে আমি তাদের সাথে কী করব .. :-) মূল বিষয়টি হ'ল কাটানো কোনও কম স্পষ্ট নয়, তবে আরও অনুকূল, তাই সাধারণভাবে আমি সে পথে যাব।
নিক বাস্টিন

6

আর-তে আপনি আরও দুটি চরিত্রের সাথে ঠিক একই জিনিসটি করতে পারেন:

x <- 0:9
x[-5:-1]
[1] 5 6 7 8 9

বা

x[-(1:5)]

আমি যদি ভেক্টরের দৈর্ঘ্য না জানি তবে আমি সর্বদা সর্বশেষ 5 উপাদানটি চাই? পাইথন সংস্করণটি এখনও কাজ করে তবে আপনার আর উদাহরণটি সর্বশেষ 15 টি উপাদান সরবরাহ করে এবং তারপরে এখনও দৈর্ঘ্যে কল করতে হবে ()?
টমাস ব্রাউন

10
সাচ্চা, আমি মনে করি না আপনার উত্তরটি সাধারণীকরণ করেছে। আপনার কোড উদাহরণটি যা করে তা হ'ল শেষ পাঁচটি রাখার পরিবর্তে প্রথম 5 টি ফলাফল বাদ দেওয়া। এই উদাহরণে এটি একই জিনিস, তবে নিম্নলিখিতগুলি কাজ করে না: x <- 0:20; x[-5:-1]- এটি শেষ পনেরটি উপাদান দেয়।
অ্যান্ড্রি

আমি পাইথন জানি না, তবে ওপি'র মধ্যে x[-5:]: এর অর্থ কী প্রথম 5 টি উপাদান এড়িয়ে যায়, বা শেষ 5 রাখে? যদি এটি প্রথমটি হয় তবে তিনি এখানে আপনার মতো অপ্রত্যক্ষভাবে আপনার দৈর্ঘ্যটি ব্যবহার করছেন (অন্যথায়, কোন উপাদানগুলি এড়িয়ে যেতে হবে তা আপনি কীভাবে জানবেন?)
নিক সাব্বে

4
পাইথনে "-" অপারেটরের অর্থ পিছনের দিকে গণনা। সুতরাং এটি সর্বদা এই ক্ষেত্রে সর্বশেষ 5 টি উপাদান ফিরিয়ে দেবে।
টমাস ব্রাউন

4
আহ ঠিক আছে, আমি অজগর জানি না এবং ধরে নিয়েছি এর অর্থ প্রথম 5 এড়িয়ে যাওয়া you tail আপনি যা চান তা হ'ল।
সাচ্চা এপসক্যাম্প

6

tailগতির উপর ভিত্তি করে এখানে অস্বীকৃতিটি সত্যিই জোর দেয় বলে মনে হচ্ছে না ধীর গতির অংশটি এই সত্য থেকে আসে যে লেজটি কাজ করা আরও নিরাপদ, যদি আপনি নিশ্চিত না হন যে এক্স দৈর্ঘ্য অতিক্রম করবে n, সংখ্যা আপনি যে উপাদানগুলিকে সাবসেট করতে চান তা:

x <- 1:10
tail(x, 20)
# [1]  1  2  3  4  5  6  7  8  9 10
x[length(x) - (0:19)]
#Error in x[length(x) - (0:19)] : 
#  only 0's may be mixed with negative subscripts

লেজটি ত্রুটি উত্পন্ন করার পরিবর্তে কেবলমাত্র সর্বাধিক সংখ্যক উপাদানকে ফিরিয়ে দেবে, সুতরাং নিজেকে পরীক্ষা করার জন্য আপনাকে কোনও ত্রুটি করার দরকার নেই। এটি ব্যবহার করার একটি দুর্দান্ত কারণ। নিরাপদ ক্লিনার কোড, যদি অতিরিক্ত মাইক্রোসেকেন্ড / মিলিসেকেন্ডগুলি এর ব্যবহারে আপনার পক্ষে বেশি গুরুত্ব দেয় না।


3

কীভাবে rev(x)[1:5]?

x<-1:10
system.time(replicate(10e6,tail(x,5)))
 user  system elapsed 
 138.85    0.26  139.28 

system.time(replicate(10e6,rev(x)[1:5]))
 user  system elapsed 
 61.97    0.25   62.23

দেরিতে মন্তব্য। ভেক্টরকে উল্টিয়ে নেওয়া প্রক্রিয়াকরণের সময় দীর্ঘ ভেক্টরগুলির পক্ষে খুব বড় large এটির সময় দেওয়ার চেষ্টা করুনx <- 1:10e6
ক্রিস এনজুগুনা

ভাল পয়েন্ট @ ক্রিসনজুগুনা। 10 এর দৈর্ঘ্যের ভেক্টর ব্যবহার করে দুর্দান্ত কাজ করে :)
ব্রায়ান ডেভিস

2

এটি করার জন্য এখানে একটি ফাংশন রয়েছে এবং যুক্তিসঙ্গত দ্রুত বলে মনে হচ্ছে।

endv<-function(vec,val) 
{
if(val>length(vec))
{
stop("Length of value greater than length of vector")
}else
{
vec[((length(vec)-val)+1):length(vec)]
}
}

ব্যবহার:

test<-c(0,1,1,0,0,1,1,NA,1,1)
endv(test,5)
endv(LETTERS,5)

মাপকাঠি:

                                                    test replications elapsed relative
1                                 expression(tail(x, 5))       100000    5.24    6.469
2 expression(x[seq.int(to = length(x), length.out = 5)])       100000    0.98    1.210
3                       expression(x[length(x) - (4:0)])       100000    0.81    1.000
4                                 expression(endv(x, 5))       100000    1.37    1.691

2

আমি এখানে কিছু সম্পর্কিত যুক্ত করছি। আমি ব্যাকএন্ড সূচকগুলি সহ কোনও ভেক্টর অ্যাক্সেস করতে চেয়েছিলাম, অর্থাত্ পুরো লেজটি নয়, tail(x, i)ফিরে আসার মতো কিছু লেখা x[length(x) - i + 1]

নিম্নলিখিত ভাষ্যগুলি আমি দুটি সমাধানকে মাপদণ্ড করেছি:

accessRevTail <- function(x, n) {
    tail(x,n)[1]
}

accessRevLen <- function(x, n) {
  x[length(x) - n + 1]
}

microbenchmark::microbenchmark(accessRevLen(1:100, 87), accessRevTail(1:100, 87))
Unit: microseconds
                     expr    min      lq     mean median      uq     max neval
  accessRevLen(1:100, 87)  1.860  2.3775  2.84976  2.803  3.2740   6.755   100
 accessRevTail(1:100, 87) 22.214 23.5295 28.54027 25.112 28.4705 110.833   100

সুতরাং এই ক্ষেত্রে এটি উপস্থিত হয় যে এমনকি ছোট ভেক্টরগুলির জন্যও tailসরাসরি অ্যাক্সেসের সাথে তুলনা করা খুব ধীর

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