I agree; argmax would the best option here; though I would hardly call it abuse. It seems perfectly readable and idiomatic to me. Though the != comparison requires an extra pass over the array, that's the kind of tradeoff you make in using numpy.
On Thu, Apr 17, 2014 at 7:45 PM, Stephan Hoyer <[email protected]> wrote: > Hi Alan, > > You can abuse np.argmax to calculate the first nonzero element in a > vectorized manner: > > import numpy as np > A = (2 * np.random.rand(100, 50, 50)).astype(int) > > Compare: > > np.argmax(A != 0, axis=0) > np.array([[np.flatnonzero(A[:,i,j])[0] for j in range(50)] for i in > range(50)]) > > You'll also want to check for all zero arrays with np.all: > > np.all(A == 0, axis=0) > > Cheers, > Stephan > > > On Thu, Apr 17, 2014 at 9:32 AM, Alan G Isaac <[email protected]>wrote: > >> Given an array A of shape m x n x n >> (i.e., a stack of square matrices), >> I want an n x n array that gives the >> minimum "depth" to a nonzero element. >> E.g., the 0,0 element of the result is >> np.flatnonzero(A[:,0,0])[0] >> Can this be vectorized? >> (Assuming a nonzero element exists is ok, >> but dealing nicely with its absence is even better.) >> >> Thanks, >> Alan Isaac >> _______________________________________________ >> NumPy-Discussion mailing list >> [email protected] >> http://mail.scipy.org/mailman/listinfo/numpy-discussion >> > > > _______________________________________________ > NumPy-Discussion mailing list > [email protected] > http://mail.scipy.org/mailman/listinfo/numpy-discussion > >
_______________________________________________ NumPy-Discussion mailing list [email protected] http://mail.scipy.org/mailman/listinfo/numpy-discussion
