Numpy: рдкрд╣рд▓рд╛ рдЧреИрд░-рд╢реВрдиреНрдп рддрддреНрд╡ (Trac #1673)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЕрдХреНрддреВре░ 2012  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

_рдореВрд▓ рдЯрд┐рдХрдЯ http://projects.scipy.org/numpy/ticket/1673 2010-11-13 рдХреЛ trac рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ tom3118 рджреНрд╡рд╛рд░рд╛ рдЕрдЬреНрдЮрд╛рдд рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ред_

"рдореИрдЯрд▓реИрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП numpy" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ
nonzero(A)[0][0]
рд╕рд░рдгреА рдП рдХреЗ рдкрд╣рд▓реЗ рдЧреИрд░-рд╢реВрдиреНрдп рддрддреНрд╡ рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред

рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ A рдПрдХ рд▓рд╛рдЦ рддрддреНрд╡ рд▓рдВрдмрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзрд┐ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдпрд╣ рдореИрдЯрд▓реИрдм рд╕реЗ рд▓реЛрдЧреЛрдВ рдХрд╛ рд╕рдВрдХреНрд░рдордг рднреА рдЖрд╕рд╛рди рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ find рдЗрддрдирд╛ рдЖрдо рд╣реИред

01 - Enhancement Other

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 3 рд╕рд╛рд▓ рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрдм numpy рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдореИрдЯрд▓реИрдм рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╣ рдХрд╛рд░реНрдп рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдкреАрдЖрд░ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ)ред

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

_trac рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ tom3118 рдиреЗ 2010-11-13_ рдХреЛ рд▓рд┐рдЦрд╛

рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ:
filter(test,A)[0]
рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ A рд▓рдВрдмрд╛ рд╣реИ рдпрд╛ test рдорд╣рдВрдЧрд╛ рд╣реИред

_@rgommers рдиреЗ 2011-03-24_ рдХреЛ рд▓рд┐рдЦрд╛

рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдЧреИрд░-рд╢реВрдиреНрдп рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдкрд╣рд▓реЗ рдХреЛрдИ рднреА рдореВрд▓реНрдп рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

_@rgommers рдиреЗ 2011-03-24_ рдХреЛ рд▓рд┐рдЦрд╛

рдЬреИрд╕рд╛ рдХрд┐ #2333 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, 1-рдбреА рдХреЗ рд▓рд┐рдП рдЕрд░реНрде рд╕реНрдкрд╖реНрдЯ рд╣реИред >1-рдбреА рд╢рдмреНрджрд╛рд░реНрде рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рд╢рд╛рдпрдж рдПрдХ рдХреАрд╡рд░реНрдб рдЬреЛ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╛ рдЗрд╕реЗ рдХреЗрд╡рд▓>1-рдбреА рдХреЗ рд▓рд┐рдП рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

_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

рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рджреВрд╕рд░реЗ рджрд┐рди рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдПрдХ рдЕрдЪреНрдЫреА рдирдЬрд╝рд░ рдбрд╛рд▓реА рд╣реИ рдФрд░ рдЖрд╢реНрд╡рд╕реНрдд рдерд╛ рдХрд┐ рдПрдХ рдЙрдкрдпреБрдХреНрдд рддреНрд╡рд░рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реА рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЪрдВрдХрд┐рдВрдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрдкрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рддреНрд╡рд░рд┐рдд рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдПред

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

рдореИрдВ рдЗрд╕реЗ рджреЗрд╡-рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реБрдЪрд┐ рд╣реИ рддреЛ рдореБрдЭреЗ рдЗрд╕реЗ рдкреАрдЖрд░ рдореЗрдВ рдмрджрд▓рдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЦреБрд╢реА рд╣реЛрдЧреАред

рдЪреАрдпрд░реНрд╕,

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 3 рд╕рд╛рд▓ рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдЕрдм numpy рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ? рдореИрдЯрд▓реИрдм рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╣ рдХрд╛рд░реНрдп рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдкреАрдЖрд░ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА (рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ)ред

рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред

рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдЖрд▓рд╕реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 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 рдХрд╛ рд░реЗрдлрд░реА рдЪреВрдХ рдЧрдпрд╛ рдерд╛)

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдХреБрд╢рд▓ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдареЛрд╕ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реНрдг рдФрд░ рдмрд╣реБрдореБрдЦреА рдирд╣реАрдВ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдПрдкреАрдЖрдИ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛ред рдКрдкрд░ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ 1D рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди), рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ C рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдХрд╛ рд▓рд╛рдн рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреБрд╢рд▓ рд▓рдЧрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдФрд░ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдорд┐рд▓рддреЗ рд╣реИрдВ:

https://pypi.python.org/pypi?name=py_find_1st& :action=display

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛, рдмреВрд▓рд┐рдпрди рд╕рд░рдгреА рдореЗрдВ рдЧреБрдЬрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╣рдж рддрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рдФрд░ рдкрд╣рд▓реЗ рд╕рдЪреНрдЪреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рд╕рд░реНрдЪрд┐рдЧ, рдЬреЛ рдЙрд╕ рдкреАрдкреАрдкреАрдЖрдИ рдкреГрд╖реНрда рдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдПрдХ рд╕реНрдЯреИрдХрдПрдХреНрд╕рдЪреЗрдВрдЬ рдкреЛрд╕реНрдЯ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИ, рдЬрд┐рд╕реЗ 70k рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рджреЗрдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред @roebel рдХреНрдпрд╛ рдЖрдкрдХреЛ рдХрднреА рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА? рдХреНрдпрд╛ рдЖрдк рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреАрдЖрд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдирд╣реАрдВ, рдореБрдЭреЗ рдХрднреА рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ, рдПрдирд╛рдХреЛрдВрдбрд╛ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдирд╛рдХреЛрдВрдбрд╛ рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдмрдирд╛рдпрд╛ рд╣реИ

https://anaconda.org/roebel/py_find_1st

рдПрдХ рдкреАрдЖрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореБрдЭреЗ рдЙрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ numpy рдореЗрдВ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ " рдкреНрд░рд╛рдердорд┐рдХрддрд╛: рд╕рд╛рдорд╛рдиреНрдп " рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХрдо рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрднреА рднреА "рд╕рд╛рдорд╛рдиреНрдп" рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓реЗрдмрд▓ рдХреЗред рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреИрдВрдкрд┐рдпрди рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рд╣рд┐рдд рдЕрдиреБрдореЛрджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПред

рд╕рдВрднрд╡рдд: рдпрд╣рд╛рдВ #8528 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬреЛ рдирд╛рдордорд╛рддреНрд░ рд░реВрдк рд╕реЗ рд▓рдЧрднрдЧ all_equal рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╛рдЧреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, https://github.com/numpy/numpy/pull/8528#issuecomment -365358119 рдореЗрдВ, @ahaldane рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирдП gufunc all_equal рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рддреБрд▓рдирд╛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдкрд░ first рдХрдореА рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ all_equal ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрдЫ рд╣реИ рдЬреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреБрдлрдВрдХ рд╕реЗ рдПрдХ рдирдИ рдХрдореА рд╡рд┐рдзрд┐ рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдпреВрдлреБрдирдХреНрд╕ рдкрд░ рдПрдХ рдирдИ рд╡рд┐рдзрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдЬреЛ first рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ (рдХрдо рд╕реЗ рдХрдо) 2012 рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред nonzero(A)[0][0] рдХреЛ рд╕рднреА A рдХреА рдЦреЛрдЬ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

рдХреНрдпрд╛ рдпрд╣ рддрдерд╛рдХрдерд┐рдд рдкрд╛рдЗрдереЛрдирд┐рдХ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ?

@yunyoulu : рдпрд╣ ufunc рддрд░реАрдХрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд╣рдЯреЗрдВ рдФрд░ рдПрдХ рдмрд╣реБ-рдЪрд░рдгреАрдп рдЧрдгрдирд╛ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ numpy рдореЗрдВ рджреЗрдЦреЗрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рддрдиреЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ:

  1. np.argwhere(x)[0] - рдбреЗрдЯрд╛ рдХрд╛ 1 рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
  2. np.argwhere(f(x))[0] - рдбреЗрдЯрд╛ рдХреЗ 2 рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
  3. np.argwhere(f(g(x)))[0] - рдбреЗрдЯрд╛ рдХреЗ 3 рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ

рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ np.first рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ рдЬрд╛рдП - рдЬреЛ рддрдм рдирд┐рдореНрди рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдЬрд╣рд╛рдВ k <= 1 рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдХрд╣рд╛рдВ рд╣реИ:

  1. np.first(x)[0] - рдбреЗрдЯрд╛ рдХрд╛ 0+k рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
  2. np.first(f(x))[0] - рдбреЗрдЯрд╛ рдХрд╛ 1+k рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
  3. np.first(f(g(x)))[0] - рдбреЗрдЯрд╛ рдХреЗ 2+k рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ

рдпрд╣рд╛рдВ рдкреВрдЫрдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдмрдЪрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреА рдореВрд▓реНрдпрд╡рд╛рди рд╣реИ? Numpy рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЧрдгрдирд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЛ рдЖрд▓рд╕реА рдмрдирд╛рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдг рдирд╣реАрдВ рдереЗред


рд░рдЧрдбрд╝рд╛ рд╣реБрдЖ

@ рдПрд░рд┐рдХ-рд╡рд╛рдЗрд╕рд░

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред рдЕрдЧрд░ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП k = 10 , рддреЛ рдпрд╣ 1+10=11 рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИ np.first(f(x))[0]

(рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП @ eric-wieser рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрд╛рджрд┐рдд, рдпрд╣ рдмрд╛рддрдЪреАрдд рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд▓рдВрдмреА рд╣реИ)

рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрдм A рдПрдХ рдмрдбрд╝рд╛ рдЯреЗрдВрд╕рд░ рд╣реИ A.shape = (n_1, n_2, ..., n_m) ред рдРрд╕реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, np.first(A) рдХреЛ n_1*n_2*...*n_m (рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрдЪрдд) рдХреЗ рдмрдЬрд╛рдп A рдХреЗ рдХреЗрд╡рд▓ k рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореБрдЭреЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдЬрдм A рдПрдХ рдмрдбрд╝рд╛ рдЯреЗрдВрд╕рд░ рд╣реЛрддрд╛ рд╣реИ

рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреВрд░реНрдг рдкрд╛рд╕ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЖрдкрдХреЛ рдХреЛрдб рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬреЛ рджреЛ рдмрд╛рд░ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдкреВрдЫрдиреЗ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдмрдЪрдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреА рдореВрд▓реНрдпрд╡рд╛рди рд╣реИ? Numpy рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЖрд▓рд╕реА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЧрдгрдирд╛ рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЛ рдЖрд▓рд╕реА рдмрдирд╛рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рд╕рднреА рдЪрд░рдг рдирд╣реАрдВ рдереЗред

рдпрд╣ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдХрд┐, рдпрджрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рд░рджреНрджреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ "рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдХреБрдЫ рдФрд░ рднреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдзреАрдорд╛ рд╣реИ"ред (рдпрд╣ рд╡рд╣реА рддрд░реНрдХ рд╣реИ рдЬреЛ рдЬрд▓рд╡рд╛рдпреБ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдареАрдХ рд╣реИ, рдЬрдм рддрдХ рдпрд╣ рджреВрд╕рд░рд╛ рджреЗрд╢ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛, рд╣рдорд╛рд░реЗ рджреЗрд╢ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред) рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВред рдпрджрд┐ рдЧрдгрдирд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ 1/рдХреЗ рджреНрд╡рд╛рд░рд╛ рддреЗрдЬ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдореМрдХрд╛ рд╣реИ, рддреЛ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реИ, рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

рд╕рд╛рде рд╣реА, рдЕрдВрддрдГрдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп (рдЬреБрдкрд┐рдЯрд░ рдЗрддреНрдпрд╛рджрд┐), рдЕрдХреНрд╕рд░ рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ "рдкрд╛рд╕" рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЖрдк рдкреВрд░реЗ рд╕реЗрд▓ рдХреЛ рднреА рддреЗрдЬ рдХрд░ рд╕рдХреЗрдВред

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)ред рдпрджрд┐ рдЖрдк рд╕рд╛рд╡рдзрд╛рди рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо (рд╡рд░реНрддрдиреА рд╕рдЯреНрдЯрд╛) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:

  1. np.first(x) - рдПрдХ рдкрд╛рд╕ рдмрдирд╛рдо рдЧреИрд░-рд╢реВрдиреНрдп рд╕рд╣реЗрдЬреЗрдВ
  2. np.first_equal(x, v) - рдПрдХ рдкрд╛рд╕ рд╕реЗрд╡ рдХрд░реЗрдВ рдмрдирд╛рдо first(np.equal(x, v))
  3. np.first_square_equal(x*x, v) - рдПрдХ рдкрд╛рд╕ рд╕реЗрд╡ рдХрд░реЗрдВ рдмрдирд╛рдо first_equal(np.square(x), v)

рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреИрдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрдиреА рд╣реЛрдЧреАред рдореИрдВ 1 рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди 2 рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реИ, рдФрд░ 3 рдореБрдЭреЗ рдмрд╣реБрдд рдирд╛рд╕рдордЭ рд▓рдЧрддрд╛ рд╣реИред

np.first рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рддрд░реНрдХ - рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ numba рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ np.first(x*x == v) _рдПрдХ рд╕реБрдВрдмрд╛ рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░_ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _does_ рдПрдХ рд╣реА рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рд╡реИрд╕реЗ рднреА рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рдЪреАрдЬреЛрдВ рдХреЛ numpy рдореЗрдВ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рдкреНрд░рджрд░реНрд╢рди рдЯреНрд╡реАрдХ рдХреЛ рдХреЗрд╡рд▓ рдорд╛рдкрдиреАрдпрддрд╛ рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ: рдХреНрдпрд╛ рдЖрдЬ рдкрд░реНрд╕рдирд▓ рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЙрддреНрддрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣реИред рддреАрди рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЬрдм рдЖрдк рдПрдХ рдорд╛рдирдХ рд▓реИрдкрдЯреЙрдк рдЦрд░реАрджрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ 8GB рдореЗрдореЛрд░реА рд╕реЗ рд▓реИрд╕ рд╣реЛрддреЗ рд╣реИрдВ; рдФрд░ рдЕрдм рднреА рдЖрдкрдХреЛ рдмрд╛рдЬрд╛рд░ рдореЗрдВ 8GB рдорд┐рд▓реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 2x рдпрд╛ 4x рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╡рд░реНрдХрд╕реНрдЯреЗрд╢рди рдЙрд╕реА рддрд░рд╣ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рд╣реИрдВред

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдмрджрд▓реЗ рдмрд┐рдирд╛ 10x рдзреАрдорд╛ рдмрдирд╛рдирд╛ рдПрдХ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХреЛ рдкрд╛рдЧрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕рд╕реЗ рднреА рдмреБрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдбрд╝рдЪрди рдХрд╛ рдкрддрд╛ рдЪрд▓рдиреЗ рдкрд░ рднреА рд╡рд╣ рдХреБрдЫ рднреА рд╕реБрдВрджрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореИрдВ рдЬреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣рдореЗрд╢рд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддреА рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдпрд╛ рдХрд╛рд░реНрдпрднрд╛рд░ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмрд╣рд╛рдирд╛ рд╣реИ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдордд рдХрд╣реЛ рдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИрдВред

@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.first_square_equal рдирд╣реАрдВ рдорд╛рдВрдЧреВрдВрдЧрд╛, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдореИрдВ рдХрднреА рдирд╣реАрдВ рдкреВрдЫреВрдВрдЧрд╛ (рдФрд░ рдХреЛрдИ рдирд╣реАрдВ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ, рдкреВрдЫрд╛) np.square_where рдХреЗ рд▓рд┐рдПред рдФрд░ рд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк 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 рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рддреБрдЪреНрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ... рдЬреЛ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдХреА рдПрдкреАрдЖрдИ рдХреЛ "рд╕рдВрдХреНрд░рдорд┐рдд" рдХреИрд╕реЗ рдХрд░реЗрдЧрд╛, рдпрд╛ рдЦреБрдж рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВред

рдЗрд╕рдиреЗ рдХрд╣рд╛, рдЕрдЧрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдиреНрди рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдкреИрдХреЗрдЬ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИред

рдирдорд╕реНрдХрд╛рд░ рдкреЙрд▓,

рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ np.flatnonzero рдФрд░ рдореЗрд░реЗ py_find_1st рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЫреЛрдЯрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдмрдирд╛рдпрд╛ рд╣реИред

рдЖрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рдВрд▓рдЧреНрди рдкрд╛рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдо

(рдЖрдзрд╛рд░) m3088.roebel: (рдкрд░реАрдХреНрд╖рдг) (g:рдорд╛рд╕реНрдЯрд░)514> ./benchmark.py
utf1st.find_1st(rr, рд╕реАрдорд╛, utf1st.cmp_equal)::
рд░рдирдЯрд╛рдЗрдо 0.131s
np.flatnonzero(rr==limit)[0]::
рд░рдирдЯрд╛рдЗрдо 2.121s
рдЕрдЧрд▓рд╛ ((рджреНрд╡рд┐рддреАрдп рдХреЗ рд▓рд┐рдП, рд╡реАрд╡реА рдЧрдгрдирд╛ рдореЗрдВ (рдЖрд░рдЖрд░) рдЕрдЧрд░ рд╡реАрд╡реА == рд╕реАрдорд╛))::
рд░рдирдЯрд╛рдЗрдо 1.612s

рдЗрд╕рд▓рд┐рдП рдЬрдмрдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдлреНрд▓реИрдЯрдиреЛрдирдЬреЗрд░реЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 25% рддреЗрдЬ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдкрд░рд┐рдгрд╛рдо рд╕рд░рдгреА рдмрдирд╛рдирд╛, рдпрд╣ рдЕрднреА рднреА py_find_1st.find_1st рд╕реЗ ~12рдзреАрдорд╛ рд╣реИред

рд╢реНрд░реЗрд╖реНрда
рдПрдХреНрд╕реЗрд▓

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдВрджреЗрд╢ рдХрд╛ рдореИрдВрдиреЗ рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдореЗрд░реЗ рдореЗрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рднреА рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдпрд╣рд╛рдБ рд╣реИ

https://github.com/roebel/py_find_1st/blob/master/test/benchmark.py

рд╢реЛрд░ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред

15/05/2020 17:33 рдХреЛ рдкреАрдХреЗ рдиреЗ рд▓рд┐рдЦрд╛:

рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ |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 ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Foadsf picture Foadsf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

astrofrog picture astrofrog  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

perezpaya picture perezpaya  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

manuels picture manuels  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Kreol64 picture Kreol64  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ