हर nth प्रविष्टि को एक सुपीरियर एरे में सब्मिट करना


95

मैं numpy के साथ एक शुरुआतकर्ता हूं, और मैं लंबे समय से अरपी सरणी से कुछ डेटा निकालने की कोशिश कर रहा हूं। मुझे जो करने की आवश्यकता है वह मेरे सरणी में एक परिभाषित स्थिति से शुरू होता है, और फिर उस स्थिति से प्रत्येक nth डेटा बिंदु को सब्सक्राइब करता है, जब तक कि मेरा सरणी समाप्त नहीं हो जाता।

मूल रूप से अगर मेरे पास था

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

मैं इसे शुरू करने के लिए इसे कम करना चाहता हूं a[1]और फिर वहां से हर चौथे बिंदु का नमूना तैयार करता हूं , जैसे कि कुछ उत्पादन करने के लिए

b = [2,2,2.....]

जवाबों:


162

आप साधारण खसखस ​​का उपयोग कर सकते हैं , बस start:stop:step

>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])

यह मूल डेटा का एक दृश्य बनाता है , इसलिए यह निरंतर समय है । यह मूल सरणी में परिवर्तन भी दर्शाएगा और पूरे मूल सरणी को स्मृति में रखेगा:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2]         # O(1), constant time
>>> b[:] = 0           # modifying the view changes original array
>>> a                  # original array is modified
array([0, 2, 0, 4, 0])

इसलिए यदि उपरोक्त दोनों में से कोई एक समस्या है, तो आप स्पष्ट रूप से एक प्रति बना सकते हैं:

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2].copy()  # explicit copy, O(n)
>>> b[:] = 0           # modifying the copy
>>> a                  # original is intact
array([1, 2, 3, 4, 5])

यह निरंतर समय नहीं है, लेकिन परिणाम मूल सरणी से बंधा नहीं है। प्रतिलिपि स्मृति में भी सन्निहित है, जो उस पर कुछ कार्य तेजी से कर सकती है।


1
संदर्भ / मूल्य प्रति के बारे में चेतावनी देने के लिए धन्यवाद। अन्यथा मैं निश्चित रूप से जाल में गिर
फॉरएवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.