We can use a vector approach based on
np.core.defchararray.addto add a string 't:'with valid strings and
np.where select based on the conditional statement and add or just use the default value of the empty string,
So, we would have such an implementation -
np.where(series1>series2,np.core.defchararray.add('t:',series2.astype(str)),'')
Strengthen it!
np.core.defchararray.add series1>series2, .
, :
mask = series1>series2
out = np.full(series1.size,'',dtype='U34')
out[mask] = np.core.defchararray.add('t:',series2[mask].astype(str))
:
def vectorized_app1(series1,series2):
mask = series1>series2
return np.where(mask,np.core.defchararray.add('t:',series2.astype(str)),'')
def vectorized_app2(series1,series2):
mask = series1>series2
out = np.full(series1.size,'',dtype='U34')
out[mask] = np.core.defchararray.add('t:',series2[mask].astype(str))
return out
-
In [283]: # Setup input arrays
...: series1 = np.asarray(range(10000)).astype(float)
...: series2 = series1[::-1]
...:
In [284]: %timeit [['', 't:'+str(s2)][s1 > s2] for s1,s2 in zip(series1, series2)]
10 loops, best of 3: 32.1 ms per loop # OP/@hpaulj soln
In [285]: %timeit vectorized_app1(series1,series2)
10 loops, best of 3: 20.5 ms per loop
In [286]: %timeit vectorized_app2(series1,series2)
100 loops, best of 3: 10.4 ms per loop
OP in comments, , , dtype series2 . , U32, dtype , str dtype, .. series2.astype('U32') np.core.defchararray.add. :
In [290]: %timeit vectorized_app1(series1,series2)
10 loops, best of 3: 20.1 ms per loop
In [291]: %timeit vectorized_app2(series1,series2)
100 loops, best of 3: 10.1 ms per loop
, !