2016-06-07 16 views
5
के बीच चुकता अंतर

मान लीजिए मैं निम्नलिखित 2 सरणियों है:योग 2 NumPy सरणी

import numpy as np 
a=np.asarray([[1,2,4], 
     [3,1,2]]) 
b=np.asarray([[2,1,1], 
     [3,2,3], 
     [4,1,2], 
     [2,2,1],]) 

एक में हर पंक्ति a_row के लिए, मैं a_row और ख में हर पंक्ति के बीच चुकता अंतर की राशि प्राप्त करना चाहते हैं । परिणामस्वरूप सरणी 2 से 4 सरणी होगी।

array([[ 11., 5., 14., 10.], 
     [ 2., 2., 1., 3.]]) 

मैं पहले से ही पाश का उपयोग कर एक समाधान को क्रियान्वित किया है::

c=np.zeros((2,4)) 
for e in range(a.shape[0]): 
    c[e,:] = np.sum(np.square(b-a[e,:]),axis=1) 
print c 

क्या मैं जरूरत है एक पूरी तरह से vectorized समाधान, जिसका अर्थ है कोई पाश की आवश्यकता है अपेक्षित परिणाम निम्न होगा।

+0

lambdas और संवृति के लिए एक प्राकृतिक तरह लगता है। – duffymo

उत्तर

3

यहाँ, एक Numpythonic दृष्टिकोण है बस b देगी क्रम में इससे सीधे a घटाना करने में सक्षम होना द्वारा:

>>> np.square(b[:,None] - a).sum(axis=2).T 
array([[11, 5, 14, 10], 
     [ 2, 2, 1, 3]]) 
+0

हाय Kasravand, आपके उत्तर के लिए धन्यवाद। यह नमूना सरणी के साथ काम करता है लेकिन मुझे अपनी वास्तविक स्क्रिप्ट में स्मृति त्रुटि मिली है। मेरी स्क्रिप्ट में, सरणी का आकार (500,3072) है और बी का आकार (5000,3072) है। मुझे लगता है कि यह शायद इसलिए है क्योंकि यह विधि स्मृति गहन है? मुझे अपने प्रश्न में उल्लिखित लूप विधि का उपयोग करके त्रुटि नहीं मिली। – Allen

+0

@Allen मैं पहली बार सुझाव देता हूं, अगर आप बड़ी संख्या से निपट नहीं रहे हैं तो आप अपनी सरणी [type] (http://docs.scipy.org/doc/numpy-1.10.1/user/basics) को परिवर्तित कर सकते हैं। type.html) 'int8' जैसे एक सरल प्रकार के लिए, यदि यह संभव नहीं है तो आप अपने सरणी को छोटे सरणी में विभाजित कर सकते हैं और उनके साथ ऑपरेशन अलग से कर सकते हैं और परिणाम को जोड़ सकते हैं। यहां एक अच्छा जवाब है http://stackoverflow.com/questions/31268998/how-to-merge-two-large-numpy-arrays-if-slicing-doesnt-resolve-memory-error – Kasramvd

3

आप SciPy के लिए उपयोग किया है, तो आप कर सकता है:

import scipy 
from scipy.spatial.distance import cdist 

import numpy as np 

a=np.asarray([[1,2,4], 
     [3,1,2]]) 
b=np.asarray([[2,1,1], 
     [3,2,3], 
     [4,1,2], 
     [2,2,1],]) 

x = cdist(a,b)**2 
# print x 
# array([[ 11., 5., 14., 10.], 
#  [ 2., 2., 1., 3.]]) 

यह cdist समारोह जो vectorized और तेजी से उपयोग करता है। आप संभवतः numba या साइथन का उपयोग करके थोड़ा अधिक गति प्राप्त कर सकते हैं, लेकिन यह अभ्यास में आपके सरणी के आकार पर निर्भर करता है।

+0

धन्यवाद जोश। मैंने परीक्षण किया है और यह ठीक काम करता है। हालांकि, इस मामले में, मुझे पूरी तरह से सदिश समाधान की आवश्यकता है। यानी Scipy समारोह का उपयोग नहीं कर सकते हैं। – Allen