मैंने ऐसा करने के कुछ तरीकों की तुलना की है, जिसमें पांडा, कई सुन्न तरीके और एक सूची समझने की विधि शामिल है।
सबसे पहले, आइए आधार रेखा से शुरू करें:
>>> import numpy as np
>>> import operator
>>> import pandas as pd
>>> x = [1, 2, 1, 2]
>>> %time count = np.sum(np.equal(1, x))
>>> print("Count {} using numpy equal with ints".format(count))
CPU times: user 52 µs, sys: 0 ns, total: 52 µs
Wall time: 56 µs
Count 2 using numpy equal with ints
इसलिए, हमारी आधार रेखा यह है कि गिनती सही होनी चाहिए 2
, और हमें इस बारे में जानकारी लेनी चाहिए 50 us
।
अब, हम भोली विधि की कोशिश करते हैं:
>>> x = ['s', 'b', 's', 'b']
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 145 µs, sys: 24 µs, total: 169 µs
Wall time: 158 µs
Count NotImplemented using numpy equal
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
"""Entry point for launching an IPython kernel.
और यहाँ, हमें गलत उत्तर मिलता है ( NotImplemented != 2
), यह हमें एक लंबा समय लगता है, और यह चेतावनी फेंकता है।
तो हम एक और भोली विधि की कोशिश करेंगे:
>>> %time count = np.sum(x == 's')
>>> print("Count {} using ==".format(count))
CPU times: user 46 µs, sys: 1 µs, total: 47 µs
Wall time: 50.1 µs
Count 0 using ==
फिर, गलत जवाब ( 0 != 2
)। यह और भी कपटी है क्योंकि इसके बाद की कोई चेतावनी नहीं है ( 0
इसे वैसे ही पास किया जा सकता है 2
)।
अब, एक सूची समझने की कोशिश करते हैं:
>>> %time count = np.sum([operator.eq(_x, 's') for _x in x])
>>> print("Count {} using list comprehension".format(count))
CPU times: user 55 µs, sys: 1 µs, total: 56 µs
Wall time: 60.3 µs
Count 2 using list comprehension
हमें यहाँ सही उत्तर मिलता है, और यह बहुत तेज़ है!
एक और संभावना pandas
:
>>> y = pd.Series(x)
>>> %time count = np.sum(y == 's')
>>> print("Count {} using pandas ==".format(count))
CPU times: user 453 µs, sys: 31 µs, total: 484 µs
Wall time: 463 µs
Count 2 using pandas ==
धीरे, लेकिन सही!
और अंत में, मैं जिस विकल्प का उपयोग करने जा रहा हूं: numpy
सरणी को object
टाइप करना:
>>> x = np.array(['s', 'b', 's', 'b']).astype(object)
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 50 µs, sys: 1 µs, total: 51 µs
Wall time: 55.1 µs
Count 2 using numpy equal
तेज और सही!
thing
(जो एक प्रकार का हो सकता है या नहीं भी हो सकता है; मुझे नहीं पता) और मैं यह देखना चाहता हूं कि क्याthing == 'some string'
और एक सरलbool
परिणाम प्राप्त करना है, मुझे क्या करना चाहिए?np.atleast_1d(thing)[0] == 'some string'
? लेकिन यह'some string'
एक सरणी के पहले तत्व में डालने वाले कुछ जोकर के लिए मजबूत नहीं है । मुझे लगता है कि मुझेthing
पहले के प्रकार का==
परीक्षण करना होगा और उसके बाद ही परीक्षण करना होगा यदि यह एक स्ट्रिंग है (या एक संख्यात्मक वस्तु नहीं)।