2015-07-07 5 views
5

को संरक्षित करने के लिए, मैं मूल्य के संकेत को संरक्षित करते समय (और ऋणात्मक जटिल संख्याओं को वापस नहीं लौटाते समय), प्रत्येक हस्ताक्षर के वर्ग रूट को लेना चाहता हूं - एक हस्ताक्षरित वर्गमूल।numpy सरणी में सभी मानों का स्क्वायर रूट,

नीचे दिया गया कोड वांछित कार्यक्षमता w/सूचियों को प्रदर्शित करता है, लेकिन numpy के अनुकूलित सरणी manpulating superpowers का लाभ नहीं ले रहा है।

def signed_sqrt(list): 
    new_list = [] 
    for v in arr: 
     sign = 1 
     if v < 0: 
      sign = -1 
     sqrt = cmath.sqrt(abs(v)) 
     new_v = sqrt * sign 
     new_list.append(new_v) 


list = [1., 81., -7., 4., -16.] 
list = signed_sqrt(list) 
# [1., 9., -2.6457, 2. -4.] 

कुछ संदर्भों के लिए, मैं [हजारों] छवि तुलनाओं के लिए हेलिंगर कर्नेल की गणना कर रहा हूं।

numpy के साथ ऐसा करने के लिए कोई आसान तरीका? धन्यवाद।

उत्तर

11

आप साइन कैप्चर करने के लिए numpy.sign फ़ंक्शन का उपयोग करने का प्रयास कर सकते हैं, और केवल पूर्ण मान के वर्ग रूट को ले लें।

import numpy as np 
x = np.array([-1, 1, 100, 16, -100, -16]) 
y = np.sqrt(np.abs(x)) * np.sign(x) 
# [-1, 1, 10, 4, -10, -4] 
संबंधित मुद्दे