_äžæã«å²ãåœãŠãããtracãŠãŒã¶ãŒtom3118ã«ãã2010-11-13ã®å ã®ãã±ããhttp://projects.scipy.org/numpy/ticket/1673ã_
ãMATLABãŠãŒã¶ãŒåãã®numpyãã¯ã
nonzero(A)[0][0]
é
åAã®æåã®éãŒãèŠçŽ ã®ã€ã³ããã¯ã¹ãæ€çŽ¢ããŸãã
ããã«äŒŽãåé¡ã¯ãAã100äžèŠçŽ ã®é·ãã§ãããæåã®èŠçŽ ããŒãã§ããå¯èœæ§ãããããšã§ãã
ããã¯éåžžã«äžè¬çãªæäœã§ãã ãã®ããã®å¹ççãªçµã¿èŸŒã¿ã®æ¹æ³ã¯éåžžã«äŸ¿å©ã§ãã ãŸãã find
ãéåžžã«äžè¬çã§ããMatlabããã®ç§»è¡ã容æã«ãªããŸãã
_tracãŠãŒã¶ãŒtom3118ã¯2010-11-13ã«æžã蟌ã¿ãŸãã_
é¢é£ãããŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
filter(test,A)[0]
A
ãé·ããã test
ãé«ãã
_ @rgommersã¯2011-03-24_ã«æžã蟌ã¿ãŸãã
æåã«ãŒã以å€ã§ããå¿ èŠã¯ãããŸãããæåã«ä»»æã®å€ã圹ç«ã¡ãŸãã
_ @rgommersã¯2011-03-24_ã«æžã蟌ã¿ãŸãã
ïŒ2333ã«èšèŒãããŠããããã«ã1-Dã®æå³ã¯æ確ã§ãã > 1次å ã®å Žåãã»ãã³ãã£ã¯ã¹ã«ã€ããŠã¯è°è«ã®äœå°ããããŸãã
ããããã軞äžã®å埩ã®é åºã決å®ããããŒã¯ãŒããæ©èœããŸãã ãŸãã¯ã> 1-Dã®å Žåã¯åçŽã«æªå®çŸ©ã«ããããšãã§ããŸãã
_tracãŠãŒã¶ãŒlcampagnã¯2011-07-09_ã«æžã蟌ã¿ãŸãã
numpyã§find_firstã«å¯Ÿããå€ãã®ãªã¯ãšã¹ããèŠãŠããŸãããããããã®ãªã¯ãšã¹ãã®ã»ãšãã©ã¯ããxæªæºã®æåã®å€ãæ€çŽ¢ããããããŒã以å€ã®æåã®å€ãæ€çŽ¢ããããªã©ã埮åŠã«ç°ãªãïŒäºææ§ã®ãªãïŒèŠä»¶ãæã£ãŠããŸãã 次ã®æ©èœä»æ§ããå§ãããŸãã
ind = array.find(x, testOp='eq', arrayOp='all', axis=0, test=None)
arguments:
x -> value to search for
testOp -> condition to test for ('eq', 'ne', 'gt', 'lt', 'ge', 'le')
arrayOp -> method for joining multiple comparisons ('any' or 'all')
axis -> the axis over which to search
test -> for convenience, this may specify a function to call to perform
the test. This is not expected to be efficient.
returns:
first index where condition is true (or test returns true, if given)
or None if the condition was never met
é
åã®ndim> 1ã®å Žåããã¹ãã¯éåžžââã®ãããŒããã£ã¹ãã«ãŒã«ã䜿çšããŠå®è¡ãããŸãã
ãããã£ãŠãããšãã°ã圢ç¶ãïŒ2,3ïŒã®é
åãããå Žåã次ã®ããã«ãªããŸãã
## find first row with all values=0
array.find(0, testOp='eq', arrayOp='all', axis=0)
## equivalent to:
for i in range(array.shape[axis]):
if (array[i] == 0).all():
return i
## find first column with any element greater than its corresponding element in col
col = array([1,2])
array.find(col, testOp='gt', arrayOp='any', axis=1)
## equivalent to:
for i in range(array.shape[axis]):
if (array[:,i] == col.any():
return i
å æ¥ãã®æ©èœãå¿ èŠã ã£ãã®ã§ãããããã調ã¹ãŠãé©åã«è¿ éãªçµæãåŸãã«ã¯Cãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ãããšç¢ºä¿¡ããŸããããPythonã§èšè¿°ããããã£ã³ã¯åã¢ãããŒãã¯é©åã«è¿ éã§ããããšã蚌æãããŸãããç§ã®å Žåãèµ·åããã®ãããæè»ã§ãã
import numpy as np
from itertools import chain, izip
def find(a, predicate, chunk_size=1024):
"""
Find the indices of array elements that match the predicate.
Parameters
----------
a : array_like
Input data, must be 1D.
predicate : function
A function which operates on sections of the given array, returning
element-wise True or False for each data value.
chunk_size : integer
The length of the chunks to use when searching for matching indices.
For high probability predicates, a smaller number will make this
function quicker, similarly choose a larger number for low
probabilities.
Returns
-------
index_generator : generator
A generator of (indices, data value) tuples which make the predicate
True.
See Also
--------
where, nonzero
Notes
-----
This function is best used for finding the first, or first few, data values
which match the predicate.
Examples
--------
>>> a = np.sin(np.linspace(0, np.pi, 200))
>>> result = find(a, lambda arr: arr > 0.9)
>>> next(result)
((71, ), 0.900479032457)
>>> np.where(a > 0.9)[0][0]
71
"""
if a.ndim != 1:
raise ValueError('The array must be 1D, not {}.'.format(a.ndim))
i0 = 0
chunk_inds = chain(xrange(chunk_size, a.size, chunk_size),
[None])
for i1 in chunk_inds:
chunk = a[i0:i1]
for inds in izip(*predicate(chunk).nonzero()):
yield (inds[0] + i0, ), chunk[inds]
i0 = i1
In [1]: from np_utils import find
In [2]: import numpy as np
In [3]: import numpy.random
In [4]: np.random.seed(1)
In [5]: a = np.random.randn(1e8)
In [6]: a.min(), a.max()
Out[6]: (-6.1194900990552776, 5.9632246301166321)
In [7]: next(find(a, lambda a: np.abs(a) > 6))
Out[7]: ((33105441,), -6.1194900990552776)
In [8]: (np.abs(a) > 6).nonzero()
Out[8]: (array([33105441]),)
In [9]: %timeit (np.abs(a) > 6).nonzero()
1 loops, best of 3: 1.51 s per loop
In [10]: %timeit next(find(a, lambda a: np.abs(a) > 6))
1 loops, best of 3: 912 ms per loop
In [11]: %timeit next(find(a, lambda a: np.abs(a) > 6, chunk_size=100000))
1 loops, best of 3: 470 ms per loop
In [12]: %timeit next(find(a, lambda a: np.abs(a) > 6, chunk_size=1000000))
1 loops, best of 3: 483 ms per loop
ãããéçºã¡ãŒãªã³ã°ãªã¹ãã«èŒããŸãããååãªé¢å¿ãããã°ãPRã«å€ããããšãã§ããã°å¹žãã§ãã
也æ¯ã
ããã¯3幎é ããŠããããšã¯ç¥ã£ãŠããŸãããããã¯çŸåšnumpyã«å«ãŸããŠããŸããïŒ Matlabã®ããã¯ã°ã©ãŠã³ãããæ¥ãŠããã®ã§ããã®é¢æ°ã¯ç§ã«ãšã£ãŠæ¬åœã«éèŠãªããã§ãã PRãããã ããã°å¹žãã§ãïŒImã¯éçºè ã®1人ã§ã¯ãããŸããïŒã
ç§ãããã«èå³ããããŸãã
ããããããã¯æããã§ãããèšåãããŠããªãã®ã§ã np.all()
ãšnp.any()
ã¯ãæ æ°ã«ããã®ãããããããã«ç°¡åã§ãïŒãããŠæ¬¡å
> 1ã®å Žåã¯æ確ã§ãïŒã çŸåš...
In [2]: zz = np.zeros(shape=10000000)
In [3]: zz[0] = 1
In [4]: %timeit -r 1 -n 1 any(zz)
1 loop, best of 1: 3.52 µs per loop
In [5]: %timeit -r 1 -n 1 np.any(zz)
1 loop, best of 1: 16.7 ms per loop
ïŒç³ãèš³ãããŸããããïŒ3446ãžã®åç §ãèŠéããŠããŸããïŒ
ç§ã¯ããªãé·ãéãã®åé¡ã®å¹ççãªè§£æ±ºçãæ¢ããŠããŸãããããã®æ©èœããµããŒãããå ·äœçãªèšç»ã¯ãªãããã§ãã®ã§ãAPIãææ¡ããããã«å®å šã§ã¯ãªãçšéã®åºã解決çãèãåºãããšããŸããäžèšïŒç¹ã«ä»ã®ãšãã1Dé åã®ã¿ããµããŒãïŒã§ãããããã«ã¯å®å šã«Cã§èšè¿°ãããŠãããšããå©ç¹ããããããããªãå¹ççã§ãã
ãœãŒã¹ãšè©³çŽ°ã¯ããã«ãããŸãïŒ
https://pypi.python.org/pypi?name=py_find_1st&ïŒaction = display
å®è£ ã«é¢ããã³ã¡ã³ããç¹ã«ããŒã«é åãæž¡ããŠæåã®çã®å€ãæ€çŽ¢ãããšãã®ããã©ãŒãã³ã¹ã®åé¡ã«ã€ããŠã®ã³ã¡ã³ãã«æè¬ããŸããããã¯ããã®PyPiããŒãžã§èª¬æãããŠããŸãã
ç§ã¯ãããã7äžå以äžé²èŠ§ãããŠãããã®æ©èœãæ¢ããŠããstackexchangeã®æçš¿ããèŠã€ããŸããã @roebelããã«ã€ããŠãã£ãŒãããã¯ãåãåã£ãããšã¯ãããŸããïŒ ãã®æ©èœã®PRãå ¥ããã ãã§ããã£ãšæ³šç®ããããããããŸããã
ãããããã£ãŒãããã¯ã¯ãããŸããã§ããããäœäººãã®äººãåé¡ãªãããã±ãŒãžã䜿çšããããã§ãã
ãšããã§ãanacondalinuxãšmacosçšã«anacondaã€ã³ã¹ããŒã©ãŒãäœæããŸãã
https://anaconda.org/roebel/py_find_1st
PRã«é¢ããŠã¯ãç°¡åã«numpyã«ããŒãžã§ããããã«ãããé©å¿ãããããã«å¿ èŠãªåªåãæ€èšããå¿ èŠããããŸãã APIã®å€æŽãšæ¡åŒµã«ã€ããŠã®è°è«ãéããŠæŠãæéã¯ãããŸããã
ã priorityïŒnormal ãã®åé€ã¯ããã®éèŠãªæ©èœãã©ããããããããŸã泚ç®ãããªãããšãæå³ããŸããïŒ
åªå é äœã¯ãã©ãã«ããªãã ãã§ãäŸç¶ãšããŠãéåžžãã§ãã ãã®åé¡ã«ã¯ãå®éã«PRãäœæããããã¥ã¡ã³ããã§ããã°ãã³ãããŒã¯ãå«ãæ¿èªããã»ã¹ãé²ããããã®ãã£ã³ããªã³ãå¿ èŠã§ãã
ããããããã§ïŒ8528ãæãã®ã«åœ¹ç«ã¡ãŸããããã¯ãåç®äžã¯çŽall_equal
ã§ãããããã®äžéšãå®è£
ããŠãããšèŠãªãããšãã§ããŸãã å®éã httpsïŒ //github.com/numpy/numpy/pull/8528#issuecomment -365358119ã§ã @ ahaldaneã¯ãæ°ããgufunc all_equal
ã®ä»£ããã«ããã¹ãŠã®æ¯èŒæŒç®åã«first
åæžã¡ãœãããå®è£
ããããšãæ瀺çã«ææ¡ããŠããŸãã all_equal
ã
ããã¯ãŸããé©å¿ãåŸ
ã£ãŠããå®è£
ãããªãããããšãæå³ããŸãïŒãã ããgufuncããæ°ããreductionã¡ãœãããžã®äºçŽ°ãªå€æŽã§ã¯ãªãããã¹ãŠã®ufuncã«æ°ããã¡ãœãããå¿
èŠãã©ãããšããçåããããŸããã©ã®first
ã¯ã»ãšãã©æå³ããããŸããã
ãã®åé¡ã¯ïŒå°ãªããšãïŒ2012幎ããç¥ãããŠããŸãã nonzero(A)[0][0]
ããã¹ãŠã®A
ãæ€çŽ¢ããªãããã«ããããã®æŽæ°ã¯ãããŸããïŒ
åžžã«ãã¹ãŠã®èŠçŽ ãã¹ãã£ã³ãããããããPythonã®æ¹æ³ã§ããïŒ
@yunyoulu ïŒããã¯ufuncã®æ¹æ³ã§ãã äžæ©äžãã£ãŠãnumpyã§ã®ãã«ãã¹ãããèšç®ã®äžè¬çãªããã»ã¹ãšãããã«ããããã¹ã®æ°ãèŠãŠã¿ãŸãããã
np.argwhere(x)[0]
-ããŒã¿ã®1ãã¹ãå®è¡ããŸãnp.argwhere(f(x))[0]
-2åã®ããŒã¿ãã¹ãå®è¡ããŸãnp.argwhere(f(g(x)))[0]
-ããŒã¿ã®3ãã¹ãå®è¡ããŸã1ã€ã®ãªãã·ã§ã³ã¯ã np.first
é¢æ°ãªã©ãå°å
¥ããããšã§ããããã¯ã次ã®ããã«ãªããŸããããã§ã k <= 1
ã¯ãæåã®èŠçŽ ãã©ãã«ãããã«ãã£ãŠç°ãªããŸãã
np.first(x)[0]
-ããŒã¿ã®0 + kãã¹ãå®è¡ããŸãnp.first(f(x))[0]
-ããŒã¿ã®1 + kãã¹ãå®è¡ããŸãnp.first(f(g(x)))[0]
-ããŒã¿ã®2 + kãã¹ãå®è¡ããŸãããã§è³ªåããã®ã¯ããã®ç¯çŽã¯æ¬åœã«ããã ãã®äŸ¡å€ãããã®ã§ããããã Numpyã¯åºæ¬çã«æ æ°ãªã³ã³ãã¥ãŒãã£ã³ã°ãã©ãããã©ãŒã ã§ã¯ãªããèšç®ã®æåŸã®ã¹ããããæ æ°ã«ããããšã¯ãåã®ãã¹ãŠã®ã¹ããããããã§ãªãã£ããšããŠããç¹ã«äŸ¡å€ã¯ãããŸããã
æ代é
ã
@ eric-wieser
ç§ã¯ãããå®å
šã«æ£ããèšèã§ãããšã¯æããªãã äœããã®åé¡ã§k = 10
ã®å Žåã np.first(f(x))[0]
ã®ããŒã¿ã®1+10=11
ãã¹ã§ã¯ãããŸãã
ïŒç°¡æœã«ããããã«@ eric-wieserã«ãã£ãŠç·šéãããŸãããããã®äŒè©±ã¯ãã§ã«é·ãããŸãïŒ
ãã®æ©èœã®å¿
èŠæ§ãæãããç解ããŠãããŠãŒã¹ã±ãŒã¹ã¯ã A
ãA.shape = (n_1, n_2, ..., n_m)
ã®å€§ããªãã³ãœã«ã§ããå Žåã§ãã ãã®ãããªå Žåã np.first(A)
ã¯ã n_1*n_2*...*n_m
$ã§ã¯ãªãA
ã®k
èŠçŽ ã®ã¿ã調ã¹ãå¿
èŠããããŸãïŒå€§å¹
ãªç¯çŽã«ãªãå¯èœæ§ããããŸãïŒã
ãã®æ©èœã®å¿ èŠæ§ã¯ãAã倧ããªãã³ãœã«ã§ããå Žåã«æãããããããŸãã
ãããããã®å ŽåãããŒã¿ã®ãã«ãã¹ãå°ãªããšã1åå®è¡ããŠããã®ã§ããããã2åã®é床ã§å®è¡ãããã³ãŒããååŸã§ããŸãã
ããã§è³ªåããã®ã¯ããã®ç¯çŽã¯æ¬åœã«ããã ãã®äŸ¡å€ãããã®ã§ããããã Numpyã¯åºæ¬çã«æ æ°ãªã³ã³ãã¥ãŒãã£ã³ã°ãã©ãããã©ãŒã ã§ã¯ãªããèšç®ã®æåŸã®ã¹ããããæ æ°ã«ããããšã¯ãåã®ãã¹ãŠã®ã¹ããããããã§ãªãã£ããšããŠããç¹ã«äŸ¡å€ã¯ãããŸããã
ããã¯èå³æ·±ã芳ç¹ã§ããã確ç«ãããå Žåããä»ã®äœããèšç®ããŠããããããã§ããŸã é ãããããèšç®ããã©ãŒãã³ã¹ãæ¹åããããã®ã»ãšãã©ãã¹ãŠã®åªåãç¡é§ã«ããããšãæ£åœåããããã«äœ¿çšã§ããŸãã ïŒããã¯ãæ°åå€å察çã®åŠå®è ã䜿çšããã®ãšåãè°è«ã§ãããŸãããã®ä»ã®åœãäœãããããŸã§ãç§ãã¡ã®åœã§äœããããããšã¯èª°ã«ã圹ç«ã¡ãŸãããïŒç§ã¯ãŸã£ãã確信ããŠããŸããã èšç®ã®äžéšã1 / ké«éåããå¯èœæ§ããããkãéåžžã«å°ããå¯èœæ§ãããå Žåãããã¯ç§ã®æèŠã§ã¯äŸ¡å€ããããŸãã
ãŸããã€ã³ã¿ã©ã¯ãã£ãã«äœæ¥ããå ŽåïŒJupyterãªã©ïŒãããŒã¿ã®ããã¹ããå¥ã ã®ã»ã«ã§è¡ãããšãéåžžã«å€ããããã»ã«å šäœã®é床ãåäžããå¯èœæ§ããããŸãã
np.first(f(x))[0]
-ããŒã¿ã®1 + kãã¹ãå®è¡ããŸã
@ eric-wieser確ãã«ã2017幎ã«ãã®åé¡ã調ã¹ããšãããããäžçš®ã®np.firstwhere(x, array_or_value_to_compare)
ãžã®ç¬¬äžæ©ã«ãªãããšãæ¬åœã«æãã§ããŸãããããã¯ç¢ºãã«ç¹å®ã®ã±ãŒã¹ã§ãããç§ã®çµéšã§ã¯éèŠã§ããã f(x)
ã
@toobaz ïŒãã®äŸã§ã¯f = lambda x: x == value_to_compare
ããããšæããŸãã
ããããŸãã«ãç§ããã®éãé²ãããšããŸã£ããèŠæããŠããçç±ã§ãïŒcc @bersbersbersïŒã 泚æããªããšãïŒææ©çãªã¹ãã«ïŒã«ãªã£ãŠããŸããŸãã
np.first(x)
-ãã¹ãšãŒã以å€ãä¿ånp.first_equal(x, v)
-ãã¹ãä¿åããvs first(np.equal(x, v))
np.first_square_equal(x*x, v)
-ãã¹ãä¿åããvs first_equal(np.square(x), v)
ããããŸã£ããã¹ã±ãŒãªã³ã°ãããªãããšã¯ããªãæçœãªã¯ãã§ãããã©ããã«ç·ãåŒãå¿ èŠããããŸãã ç§ã¯1ãèš±å¯ãããããšã«å°ãè³æã§ããã2ãèš±å¯ãããããšã¯ããã§ã«APIè¡šé¢ç©ã®ççºçå¢å ã§ããã3ã¯ç§ã«ã¯éåžžã«è³¢æã§ã¯ãªãããã§ãã
np.first
ãæ¯æãã1ã€ã®åŒæ°-ãããå®è£
ããå Žåã numba
ã¯ã np.first(x*x == v)
ã_numbaã³ã³ããã¹ãå
ã§_å®éã«ã·ã³ã°ã«ãã¹ãå®è¡ããããã«ç¹æ®ãªã±ãŒã¹ã«ããããšãã§ããŸãã
ãšã«ãããåé¡ã®çŸåšã®ç¶æ³ãæããã«ãããnumpyã§æ æ°ãªããšãããããšã¯äžå¯èœã§ããããšãç¥ã£ãŠããã®ã¯è¯ãããšã§ãã
ãã ããããã©ãŒãã³ã¹ã®åŸ®èª¿æŽãã¹ã±ãŒã©ããªãã£ãŒã®ã¿ã§èæ ®ããå Žåãç§ã¯å¿«é©ã§ã¯ãããŸããã
ç°¡åãªè³ªåãããŠã¿ãŸããããä»æ¥ãããŒãœãã«ã³ã³ãã¥ãŒã¿ã¯æ¡åŒµãããŠããŸããïŒ çãã¯ééããªãNOã§ãã 3幎åã«æšæºã®ã©ããããããè³Œå ¥ãããšã8GBã®ã¡ã¢ãªãæèŒãããŠããŸãã ãããŠä»ã§ãåžå Žã«ã¯8GBããããŸãã ãã ãããã¹ãŠã®ãœãããŠã§ã¢ã¯ã以åã®2åãŸãã¯4åã®ã¡ã¢ãªã䜿çšããŠããŸãã å°ãªããšãã¯ãŒã¯ã¹ããŒã·ã§ã³ã¯ãã¯ã©ã¹ã¿ãŒãšåãããã«ã¹ã±ãŒãªã³ã°ããŠããŸããã
è€éãããŸã£ããå€ããã«é¢æ°ã10åé ãããããšã¯ã1人ã®ããŒã¿ãµã€ãšã³ãã£ã¹ãã倢äžã«ãããã®ã«ååã§ãã ããã«æªãããšã«ããããã¡ã€ãªã³ã°ã«ãã£ãŠããã«ããã¯ãç¹å®ããããšããŠãã圌ãã§ãããšã¬ã¬ã³ããªããšã¯äœããããŸããã
ç§ã詳ãã説æããããšããŠããã®ã¯ãæ æ°ãªåŠçãè¡ãèœåãæã€ããšãåžžã«æãŸãããã·ã¹ãã ã®å¿çæ§ãšèšèªã䜿çšãã人ã ã®çç£æ§ã«ãšã£ãŠéèŠã«ãªãå¯èœæ§ããããšããããšã§ãã ã©ã€ãã©ãªéçºã®é£ãããäœæ¥è² è·ã¯ããããã®æ©èœãå®è£ ããªãããšã®éåžžã«è¯ãèšãèš³ã«ãªãã確ãã«ç解ã§ããŸããããããã圹ã«ç«ããªããšã¯èšããªãã§ãã ããã
@toobaz ïŒãã®äŸã§ã¯
f = lambda x: x == value_to_compare
ããããšæããŸãã
æ£ãã
ããããŸãã«ãç§ããã®éãé²ãããšããŸã£ããèŠæããŠããçç±ã§ãïŒcc @bersbersbersïŒã 泚æããªããšãïŒææ©çãªã¹ãã«ïŒã«ãªã£ãŠããŸããŸãã
1. `np.first(x)` - save a pass vs nonzero 2. `np.first_equal(x, v)` - save a pass vs `first(np.equal(x, v))` 3. `np.first_square_equal(x*x, v)` - save a pass vs `first_equal(np.square(x), v)`
ç§ã¯ããªãã®æžå¿µãç解ããŠããŸããã np.square_where
ãèŠæ±ããããšã¯æ±ºããŠãªãïŒãããŠèª°ãèŠæ±ããªãïŒã®ãšãŸã£ããåãããã«np.first_square_equal
ãèŠæ±ããããšã¯æ±ºããŠãããŸããã ã¯ããããã§ãã3ãå®è¡ãããšãããŒã¿ã®ãã«ãã¹ãäœæããããšãæå³ããŸãããã ãã v
ã¯äžåºŠäœæãããããã x
ã®ããŸããŸãªå€ãæ¢ãå¿
èŠããããããããŸããã ã ããšãã°ïŒç°¡åã«ããããã«äŸ2ã«æ»ããŸãïŒã30åã®å¯èœãªã«ããŽãªãã¹ãŠã10 ^ 9ã¢ã€ãã é
åã«è¡šç€ºããããã©ããã確èªããããšæããŸãããããŠãããããã¹ãŠãæåã®10 ^ 3èŠçŽ ã«è¡šç€ºãããããšã匷ãçã£ãŠããŸãã
ããã§ãæåã«ç§ã®åã®ã³ã¡ã³ããæ確ã«ããŸãããïŒç§ã®çŽæãæºããé¢æ°ãšããŠnp.firstwhere(x, array_or_value_to_compare)
ã欲ããã®ã§ããã2017幎ã«ç§ãæã£ãŠããèšç®äžã®åé¡ã¯np.first
ã ãã§ã解決ãããã§ãããã
第äºã«ããã€ã³ãã¯-ç§ãæãã«-åäžã®åŒã³åºãã®å®è¡æéã ãã§ã¯ãããŸããã ãšã«ãã2ãš3ãå®è¡ããã«ã¯ãããŒã¿ã®ãã«ãã¹ãäœæããå¿ èŠãããã®ã¯äºå®ã§ã...ããããããŒã¿ãåæåãããšãã«ãã§ã«ãã®ãã¹ãå®è¡ããå¯èœæ§ããããä»ã¯æ¬åœã«ã¹ããŒãã¢ããããæ¹æ³ãæ¢ããŠããŸãé »ç¹ãªæäœã
np.first
ãæšæºã®numpyã¢ãããŒãããå®éã«éžè±ããŠãããšããããªãã®ææãç解ããŸãããããŸãå®è£
ããã®ã¯ç°¡åã§ã¯ãªããããããŸãã...ç§ã«ã¯ããããŸããããAPIã®æ®ãã®éšåã«ã©ã®ããã«ãææããããã§ãããŸãã¯ç¬èªã®å€§ããªAPIãæé·ãããŸãã
ãšã¯ããã代ããã«ãããæ¬åœã«numpyã¹ã³ãŒããè¶ ããŠãããšæãå Žåã¯ã代ããã«å°ããªç¬ç«ããããã±ãŒãžããã®ã¹ã³ãŒãããããããããŸããã
ããã«ã¡ã¯ããŒã«ã
ç§ã¯ããªãã®ãœãªã¥ãŒã·ã§ã³ãnp.flatnonzeroãšç§ã®py_find_1stæ¡åŒµæ©èœãšæ¯èŒããå°ããªãã³ãããŒã¯ãäœæããŸããã
ãã³ãããŒã¯ãæ·»ä»ãããŠããŸãã
ããã«çµæããããŸã
ïŒããŒã¹ïŒm3088.roebel :(ãã¹ãïŒïŒgïŒmasterïŒ514> ./benchmark.py
utf1st.find_1stïŒrrãlimitãutf1st.cmp_equalïŒ::
ã©ã³ã¿ã€ã 0.131ç§
np.flatnonzeroïŒrr == limitïŒ[0] ïŒïŒ
ã©ã³ã¿ã€ã 2.121s
nextïŒïŒii for iiãvv in enumerateïŒrrïŒif vv == limitïŒïŒ::
ã©ã³ã¿ã€ã 1.612s
ãããã£ãŠãææ¡ããããœãªã¥ãŒã·ã§ã³ã¯ãå¿
èŠããªããããflatnonzeroããã25ïŒ
é«éã§ãã
çµæã®é
åãäœæããŠããpy_find_1st.find_1stãããçŽ12é
ãã§ãã
äžçª
ã¢ã¯ã»ã«
ç·šéïŒ
ã¡ãŒã«ã§è¿ä¿¡ããã¡ãã»ãŒãžãæ¶ããããã§ãã¡ãŒã«ã«ããã³ãããŒã¯ãä»ããŠããŸãã ãã³ãããŒã¯ã¯ãã¡ã
https://github.com/roebel/py_find_1st/blob/master/test/benchmark.py
éšé³ã§ããããªããã
15/05/2020 17:33ã«ãPKã¯æ¬¡ã®ããã«æžããŠããŸãã
| nextïŒi for iãv in enumerateïŒxïŒif vïŒ|ã¯ã©ãã§ããïŒ
â
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/numpy/numpy/issues/2269#issuecomment-629314457ã§è¡šç€ºããããç»é²ã解é€ããŠãã ãã
https://github.com/notifications/unsubscribe-auth/ACAL2LS2YZALARHBHNABVILRRVOEPANCNFSM4ABV5HGA ã
æãåèã«ãªãã³ã¡ã³ã
ããã¯3幎é ããŠããããšã¯ç¥ã£ãŠããŸãããããã¯çŸåšnumpyã«å«ãŸããŠããŸããïŒ Matlabã®ããã¯ã°ã©ãŠã³ãããæ¥ãŠããã®ã§ããã®é¢æ°ã¯ç§ã«ãšã£ãŠæ¬åœã«éèŠãªããã§ãã PRãããã ããã°å¹žãã§ãïŒImã¯éçºè ã®1人ã§ã¯ãããŸããïŒã