_trac μ¬μ©μ tom3118μ΄ 2010-11-13μ μλ³Έ ν°μΌ http://projects.scipy.org/numpy/ticket/1673 , unknownμ ν λΉνμ΅λλ€._
"matlab μ¬μ©μλ₯Ό μν numpy"λ λ€μμ μ¬μ©ν κ²μ μ μν©λλ€.
nonzero(A)[0][0]
λ°°μ΄ Aμ 0μ΄ μλ 첫 λ²μ§Έ μμμ μΈλ±μ€λ₯Ό μ°Ύμ΅λλ€.
μ΄κ²μ λ¬Έμ λ Aκ° λ°±λ§ κ°μ μμ κΈΈμ΄κ° λ μ μκ³ μ²« λ²μ§Έ μμκ° 0μΌ μ μλ€λ κ²μ λλ€.
μ΄κ²μ λ§€μ° μΌλ°μ μΈ μμ
μ
λλ€. μ΄λ₯Ό μν ν¨μ¨μ μΈ λ΄μ₯ λ°©λ²μ΄ λ§€μ° μ μ©ν κ²μ
λλ€. λν find
κ° μΌλ°μ μΈ Matlabμμ μ¬λλ€μ΄ μ½κ² μ νν μ μμ΅λλ€.
_trac μ¬μ©μ tom3118μ΄ 2010-11-13μ μμ±νμ΅λλ€_
κ΄λ ¨ μ¬μ© μ¬λ‘λ λ€μκ³Ό κ°μ΅λλ€.
filter(test,A)[0]
A
κ° κΈΈκ±°λ test
κ° λΉμλλ€.
__@rgommers λ 2011-03-24μ μμ±νμ΅λλ€.
0μ΄ μλ 첫 λ²μ§Έ κ°μΌ νμλ μμΌλ©° λ¨Όμ λͺ¨λ κ°μ΄ μ μ©ν κ²μ λλ€.
__@rgommers λ 2011-03-24μ μμ±νμ΅λλ€.
#2333μμ μΈκΈνλ―μ΄ 1-Dμ λν μλ―Έλ λͺ νν©λλ€. >1-Dμ κ²½μ° μλ―Έλ‘ μ΄ λ Όμ λμμ λλ€.
μλ§λ μΆμ λν λ°λ³΅ μμλ₯Ό κ²°μ νλ ν€μλκ° μλν κ²μ λλ€. λλ >1-Dμ λν΄ λ¨μν μ μλμ§ μμ μ μμ΅λλ€.
_trac μ¬μ©μ lcampagnμ΄ 2011-07-09μ μμ±νμ΅λλ€.
numpyμμ find_firstμ λν λ§μ μμ²μ 보μμ§λ§ μ΄λ¬ν μμ²μ λλΆλΆμ "xλ³΄λ€ μμ 첫 λ²μ§Έ κ° μ°ΎκΈ°" λλ "0μ΄ μλ 첫 λ²μ§Έ κ° μ°ΎκΈ°"μ κ°μ΄ λ―Έλ¬νκ² λ€λ₯Έ(νΈνλμ§ μλ) μꡬ μ¬νμ΄ μμ΅λλ€. λ€μ κΈ°λ₯ μ¬μμ μ μν©λλ€.
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 μ루μ μ΄ νμνλ€κ³ νμ νμ§λ§ νμ΄μ¬μΌλ‘ μμ±λ μ²ν¬ μ κ·Ό λ°©μμ μ μ νκ² λΉ λ₯΄κ³ λ§μ λ΄ κ²½μ°μλ λΆν νκΈ°μ λ μ μ°ν©λλ€.
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μ λμ΄ νκ°λ κ²μ λλ€(μμ κ°λ°μ μ€ ν λͺ μ΄ μλ).
λλ μ΄κ²μ κ΄μ¬μ΄ μμ κ²μ΄λ€.
μ΄μ©λ©΄ λΉμ°νμ§λ§ μΈκΈλμ§ μμκΈ° λλ¬Έμ 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 νμ΄μ§μ μ€λͺ λ 첫 λ²μ§Έ μ°Έ κ°μ κ²μν λ λ€μ λλΌμ΄ μ±λ₯ λ¬Έμ μ λν μ§λ¬Έμ κ°μ¬λ립λλ€.
70,000λ² μ΄μ μ‘°νλ μ΄ κΈ°λ₯μ μ°Ύκ³ μλ stackexchange κ²μλ¬Ό μμ μ΄κ²μ μ°Ύμμ΅λλ€. @roebel μ΄μ λν νΌλλ°±μ λ°μ μ μ΄ μμ΅λκΉ? λ λ§μ κ΄μ¬μ λ μ μλ κΈ°λ₯μ λν PRμ λ£μ μ μμ΅λκΉ?
νΌλλ°±μ λ°μ μ μ μμ§λ§ λͺλͺ μ¬λλ€μ λΆλͺ
ν λ¬Έμ μμ΄ ν¨ν€μ§λ₯Ό μ¬μ©νμ΅λλ€.
BTW, λλ μλμ½λ€ μ€μΉ νλ‘κ·Έλ¨μ λ§λ€μμ΅λλ€.
https://anaconda.org/roebel/py_find_1st
PRκ³Ό κ΄λ ¨νμ¬ numpyμ μ½κ² λ³ν©λ μ μλλ‘ μ΄λ₯Ό μ‘°μ νλ λ° νμν λ Έλ ₯μ μ‘°μ¬ν΄μΌ ν©λλ€. API λ³κ²½ λ° νμ₯μ λν΄ ν λ‘ ν μκ°μ΄ μμ΅λλ€.
" priority:normal "μ μ κ±°νλ©΄ μ΄ μ€μν κΈ°λ₯μ λν κ΄μ¬μ΄ μ€μ΄λ€κΉμ?
μ°μ μμλ λ μ΄λΈ μμ΄ μ¬μ ν "보ν΅"μ λλ€. μ΄ λ¬Έμ λ μ€μ λ‘ PRμ λ§λ€κ³ λ¬Έμν λ° λ²€μΉλ§ν¬λ₯Ό ν¬ν¨ν μΉμΈ νλ‘μΈμ€λ₯Ό ν΅ν΄ νΈμν μ±νΌμΈμ΄ νμν©λλ€.
λͺ
λͺ©μ all_equal
μ λμ΄μ§λ§ μ΄κ²μ μΌλΆλ₯Ό ꡬννλ κ²μΌλ‘ λ³Ό μ μλ #8528μ κ°λ¦¬ν€λ κ²μ΄ μ¬κΈ°μμ μ μ©ν κ²μ
λλ€. μ€μ λ‘ https://github.com/numpy/numpy/pull/8528#issuecomment -365358119μμ @ahaldane μ μλ‘μ΄ gufunc all_equal
λμ λͺ¨λ λΉκ΅ μ°μ°μμ first
κ°μ λ°©λ²μ ꡬννλ κ²μ λͺ
μμ μΌλ‘ μ μν©λλ€. all_equal
.
μ΄κ²μ λν μλΉν μμ ꡬνμ΄ μ μλκΈ°λ₯Ό κΈ°λ€λ¦¬κ³ μμμ μλ―Έν©λλ€(gufuncμμ μλ‘μ΄ μΆμ λ°©λ²μΌλ‘μ μ¬μν λ³κ²½μ μλλ©° λͺ¨λ ufuncμ λν μλ‘μ΄ λ°©λ²μ μνλμ§ μ¬λΆμ λν μ§λ¬Έμ΄ μμ΅λλ€. first
λ κ±°μ μλ―Έκ° μμ΅λλ€.
μ΄ λ¬Έμ λ (μ μ΄λ) 2012λ
μ΄νλ‘ μλ €μ Έ μμ΅λλ€. nonzero(A)[0][0]
κ° A
μ 체λ₯Ό κ²μνμ§ λͺ»νλλ‘ νλ λ°©λ²μ λν μ
λ°μ΄νΈκ° μμ΅λκΉ?
λͺ¨λ μμλ₯Ό ββνμ μ€μΊνλ μ΄λ₯Έλ° Pythonic λ°©μμ λκΉ?
@yunyoulu : ufunc λ°©μμ λλ€. ν κ±Έμ λ€λ‘ λ¬Όλ¬λμ numpyμμ λ€λ¨κ³ κ³μ°μ μΌλ°μ μΈ νλ‘μΈμ€μ νμν ν¨μ€ μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
np.argwhere(x)[0]
- λ°μ΄ν° 1ν ν΅κ³Όnp.argwhere(f(x))[0]
- λ°μ΄ν°μ 2ν μ λ¬μ μνν©λλ€.np.argwhere(f(g(x)))[0]
- λ°μ΄ν°μ 3ν μ λ¬μ μνν©λλ€.ν κ°μ§ μ΅μ
μ 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κ° ν° ν μμΌ λ κ°μ₯ λ§μ΄ λ΄ λλ€.
μλ§λ μ΄ κ²½μ°μ λΉμ μ μ΄λ―Έ λ°μ΄ν°μ μ 체 ν¨μ€λ₯Ό ν λ² μ΄μ μλ£νμΌλ―λ‘ κΈ°κ»ν΄μΌ λ λ°° λΉ λ₯΄κ² μ€νλλ μ½λλ₯Ό μ»μ μ μμ΅λλ€.
μ¬κΈ°μ λ¬Όμ΄λ³Ό μ§λ¬Έμ - μ΄ μ μ½μ΄ μ λ§ κ·Έλ§ν κ°μΉκ° μμ΅λκΉ? Numpyλ κ·Όλ³Έμ μΌλ‘ κ²μΌλ₯Έ μ»΄ν¨ν νλ«νΌμ΄ μλλ©° κ³μ°μ λ§μ§λ§ λ¨κ³λ₯Ό κ²μΌλ₯Έ κ²μΌλ‘ λ§λλ κ²μ μ΄μ μ λͺ¨λ λ¨κ³κ° κ·Έλ μ§ μμ κ²½μ° νΉν κ°μΉκ° μμ΅λλ€.
μ΄λ ν립λ κ²½μ° "λ€λ₯Έ κ²λ κ³μ° μ€μ΄κ³ μ¬μ ν λ리기 λλ¬Έμ" κ³μ° μ±λ₯μ κ°μ νκΈ° μν κ±°μ λͺ¨λ λ Έλ ₯μ λλΉνλ κ²μ μ λΉννλ λ° μ¬μ©λ μ μλ€λ ν₯λ―Έλ‘μ΄ κ΄μ μ λλ€. (κΈ°νλ³ν νλμ λΆμ νλ μ¬λλ€μ΄ μ¬μ©νλ κ²κ³Ό κ°μ μ£Όμ₯μ λλ€. λ€λ₯Έ λλΌκ° 무μΈκ°λ₯Ό ν λκΉμ§ μ°λ¦¬λλΌμμ 무μΈκ°λ₯Ό νλ κ²μ λꡬμκ²λ λμμ΄ λμ§ μμ΅λλ€.) λλ μ ν νμ νμ§ λͺ»ν©λλ€. kκ° λ§€μ° μμ μ μ¬μ μΌλ‘ λ§€μ° μμ 1/kλ§νΌ κ³μ°μ μΌλΆ μλλ₯Ό λμΌ μ μλ κΈ°νκ° μλ€λ©΄, μ μκ°μλ κ·Έλ΄ κ°μΉκ° μμ΅λλ€.
λν λνμμΌλ‘ μμ ν λ(Jupyter λ±) λ§€μ° μμ£Ό λ³λμ μ μμ λ°μ΄ν° "μ λ¬"μ μννλ―λ‘ κ²°κ΅ μ 체 μ μ μλλ λμΌ μ μμ΅λλ€.
np.first(f(x))[0]
- λ°μ΄ν°μ 1+k ν¨μ€λ₯Ό μνν©λλ€.
@eric-wieser μ€μ λ‘ 2017λ
μ μ΄ λ¬Έμ λ₯Ό 보μμ λ np.firstwhere(x, array_or_value_to_compare) μΌμ’
μ np.firstwhere(x, array_or_value_to_compare)
λ₯Ό ν₯ν 첫 λ²μ§Έ λ¨κ³κ° λκΈ°λ₯Ό μ λ§λ‘ λ°λμ΅λλ€. μ΄λ μ€μ λ‘ νΉμ μ¬λ‘μ΄μ§λ§ μ κ²½νμ μ€μν©λλ€. f(x)
.
@toobaz : κ·Έ μμμ f = lambda x: x == value_to_compare
κ° μλ€κ³ κ°μ ν©λλ€.
μ΄κ²μ΄ λ°λ‘ λ΄κ° μ΄ κΈΈμ κ°λ κ²μ μ‘°μ¬νλ μ΄μ μ λλ€(cc @bersbersbers). μ£Όμνμ§ μμΌλ©΄ λ€μκ³Ό κ°μ΄ λλ©λλ€.
np.first(x)
- ν¨μ€ λ 0μ΄ μλ κ° μ μ₯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
μ μ°¬μ±νλ ν κ°μ§ μ£Όμ₯ - μ΄λ₯Ό ꡬννλ©΄ np.first(x*x == v)
_numa 컨ν
μ€νΈ λ΄μμ_ μ€μ λ‘λ λ¨μΌ ν¨μ€λ₯Ό _μν_νλλ‘ numba
λ₯Ό νΉμ μΌμ΄μ€λ‘ μ§μ ν μ μμ΅λλ€.
μ΄μ¨λ λ¬Έμ μ νμ¬ μνλ₯Ό λͺ νν νλ numpyμμ κ²μΌλ₯Έ μμ μ μννλ κ²μ΄ λΆκ°λ₯νλ€λ κ²μ μλ κ²μ΄ μ’μ΅λλ€.
κ·Έλ¬λ μ±λ₯ μ‘°μ μ΄ νμ₯μ±μμλ§ κ³ λ €λλ κ²½μ°μλ νΈμν¨μ λλΌμ§ λͺ»ν©λλ€.
κ°λ¨ν μ§λ¬Έμ ν΄λ³΄μ. μ€λλ κ°μΈμ© μ»΄ν¨ν°κ° νμ₯λκ³ μμ΅λκΉ? λλ΅μ νμ€ν NO μ λλ€. 3λ μ νμ€ λ ΈνΈλΆμ ꡬμ νλ©΄ 8GB λ©λͺ¨λ¦¬κ° μ₯μ°©λμ΄ μμ΅λλ€. μ΄μ μμ₯μμ μ¬μ ν 8GBλ₯Ό μ°Ύμ μ μμ΅λλ€. κ·Έλ¬λ λͺ¨λ μννΈμ¨μ΄λ μ΄μ λ³΄λ€ 2λ°° λλ 4λ°° λ λ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ μ΄λ μν¬μ€ν μ΄μ μ ν΄λ¬μ€ν°μ κ°μ λ°©μμΌλ‘ νμ₯λμ§ μμ΅λλ€.
볡μ‘μ±μ μ ν λ³κ²½νμ§ μκ³ ν¨μλ₯Ό 10λ°° λλ¦¬κ² λ§λλ κ²μ ν λ°μ΄ν° κ³Όνμλ₯Ό λ―ΈμΉκ² λ§λ€κΈ°μ μΆ©λΆν©λλ€. μ€λ Ή νλ‘νμΌλ§μ ν΅ν΄ λ³λͺ© νμμ νμ νλλΌλ κ·Έκ° ν μ μλ μ°μν μΌμ μμ΅λλ€.
λ΄κ° μμΈν μ€λͺ νλ €κ³ νλ κ²μ κ²μΌλ₯Έ μ²λ¦¬λ₯Ό μνν μ μλ λ₯λ ₯μ κ°λ κ²μ΄ νμ λ°λμ§νλ©° μμ€ν μ μλ΅μ±κ³Ό μΈμ΄λ₯Ό μ¬μ©νλ μ¬λλ€μ μμ°μ±μ μ€μν μ μλ€λ κ²μ λλ€. λΌμ΄λΈλ¬λ¦¬ κ°λ°μ μ΄λ €μμ΄λ μμ λμ μ΄λ¬ν κΈ°λ₯μ ꡬννμ§ μλ κ²μ λν μμ£Ό μ’μ λ³λͺ μ΄λ©° νμ€ν μ΄ν΄ν μ μμ§λ§ μ μ©νμ§ μλ€κ³ λ§νμ§ λ§μμμ€.
@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)`
λλ λΉμ μ μ°λ €λ₯Ό μ΄ν΄νμ§λ§ $#$3 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, μ ν, utf1st.cmp_equal)::
λ°νμ 0.131μ΄
np.flatnonzero(rr==νκ³)[0]::
λ°νμ 2.121μ΄
next((iiμ κ²½μ° ii, vv == limit)μΈ κ²½μ° enumerate(rr)μ vv)::
λ°νμ 1.612μ΄
λ°λΌμ μ μλ μ루μ
μ νμνμ§ μκΈ° λλ¬Έμ flatnonzeroλ³΄λ€ 25% λΉ λ¦
λλ€.
κ²°κ³Ό λ°°μ΄μ μμ±ν λ μ¬μ ν py_find_1st.find_1stλ³΄λ€ ~12 λ립λλ€.
μ΅μμ
μ
μ
νΈμ§νλ€:
λ©μΌλ‘ λ΅μ₯μ λ³΄λΈ λ©μμ§κ° μ¬λΌμ§κ³ λ΄ λ©μΌμ λ²€μΉλ§ν¬λ 첨λΆλ κ² κ°μ΅λλ€. λ²€μΉλ§ν¬λ μ¬κΈ°
https://github.com/roebel/py_find_1st/blob/master/test/benchmark.py
μμ μ£μ‘ν©λλ€.
2020-05-15 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μ λμ΄ νκ°λ κ²μ λλ€(μμ κ°λ°μ μ€ ν λͺ μ΄ μλ).