इस तरह के मामलों में, masking
में मदद करता है -
def mask_vectorized_app(x):
out = np.empty_like(x)
mask = x>=0
mask_rev = ~mask
out[mask] = np.log(x[mask]+1)
out[mask_rev] = -np.log(-x[mask_rev]+1)
return out
परिचय numexpr
module हमें आगे मदद करता है।
import numexpr as ne
def mask_vectorized_numexpr_app(x):
out = np.empty_like(x)
mask = x>=0
mask_rev = ~mask
x_masked = x[mask]
x_rev_masked = x[mask_rev]
out[mask] = ne.evaluate('log(x_masked+1)')
out[mask_rev] = ne.evaluate('-log(-x_rev_masked+1)')
return out
@user2685079's post
से प्रेरित होकर और फिर logarithmetic संपत्ति का उपयोग कर: log(A**B) = B*log(A)
, हम लॉग संगणना में संकेत में धक्का कर सकते हैं और यह हमें numexpr
के साथ और अधिक काम करने के लिए अनुमति देता है अभिव्यक्ति का मूल्यांकन, इसलिए जैसे -
s = (-2*(x<0))+1 # np.sign(x)
out = ne.evaluate('log((abs(x)+1)**s)')
कम्प्यूटिंग sign
तुलना का उपयोग कर किसी अन्य तरीके से हमें s
देता है -
s = (-2*(x<0))+1
def loopy_app(x):
out = np.empty_like(x)
for i in range(len(out)):
out[i] = f(x[i])
return out
समय और सत्यापन - -
In [141]: x = np.random.randn(100000)
...: print np.allclose(loopy_app(x), mask_vectorized_app(x))
...: print np.allclose(loopy_app(x), mask_vectorized_numexpr_app(x))
...: print np.allclose(loopy_app(x), mask_vectorized_numexpr_app2(x))
...:
True
True
True
In [142]: %timeit loopy_app(x)
...: %timeit mask_vectorized_numexpr_app(x)
...: %timeit mask_vectorized_numexpr_app2(x)
...:
10 loops, best of 3: 108 ms per loop
100 loops, best of 3: 3.6 ms per loop
1000 loops, best of 3: 942 µs per loop
तुलना के लिए
def mask_vectorized_numexpr_app2(x):
return ne.evaluate('log((abs(x)+1)**((-2*(x<0))+1))')
रनटाइम परीक्षण
दीवाना दृष्टिकोण -अंत में, हम इस numexpr
में धक्का कर सकते हैं अभिव्यक्ति का मूल्यांकन
के साथ या बिना numexpr
मूल्यांकन @user2685079's solution
का उपयोग करना np.sign
का उपयोग कर पहले भाग को बदलने के लिए और उसके बाद -
In [143]: %timeit np.sign(x) * np.log(1+abs(x))
100 loops, best of 3: 3.26 ms per loop
In [144]: %timeit np.sign(x) * ne.evaluate('log(1+abs(x))')
1000 loops, best of 3: 1.66 ms per loop
क्या पोस्ट किए गए समाधान आपके लिए काम करते हैं? – Divakar
@ दिवाकर क्षमा करें, मुझे अभी तक जांच करने की संभावना नहीं है। मैं निकटतम समय में कोशिश करूंगा और एक उत्तर – ichernob