ฉันได้เปรียบเทียบวิธีการสองสามวิธีที่เป็นไปได้ในการทำเช่นนี้รวมถึงแพนด้าวิธีการจำนวนมากและวิธีการทำความเข้าใจรายการ
ก่อนอื่นเริ่มต้นด้วยพื้นฐาน:
>>> 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
ก่อนจากนั้นทำการ==
ทดสอบว่าเป็นสตริง (หรือไม่ใช่วัตถุที่เป็นตัวเลข)