2015-04-22 1 views
1

Ceci est mon objectif, en utilisant Python Numpy:Python, ce qui crée une matrice de grande dimension des produits de point 3 dimensions

Je voudrais créer un (1000,1000) matrice bidimensionnelle/matrice de valeurs de produit scalaire. Cela signifie que chaque réseau d'entrée/de la matrice est le produit scalaire de vecteurs de 1 à 1000. la construction de cette théorie est simple: on définit un (1,1000) matrice dimensionnelle des vecteurs V1, V2, ..., v1000

import numpy as np 
vectorvalue = np.matrix([v1, v2, v3, ..., v1000]) 

et prend le produit scalaire avec le transposer, à savoir

matrix_of_dotproducts = np.tensordot(vectorvalue.T, vectorvalue) 

et la forme de la matrice/matrice sera (1000, 1000). L'entrée (1,1) sera le produit scalaire des vecteurs (v1, v1), l'entrée (1,2) sera le produit scalaire des vecteurs (v1, v2), etc. Pour calculer le produit scalaire avec numpy pour un vecteur en trois dimensions, il est sage d'utiliser numpy.tensordot() au lieu de numpy.dot()

Voici mon problème: Je ne commence pas par un tableau de valeurs vectorielles. Je commence par trois tableaux de 1000 éléments de chaque valeur de coordonnées, c'est-à-dire un tableau de coordonnées x, de coordonnées y et de coordonnées z.

xvalues = np.array([x1, x2, x3, ..., x1000]) 
yvalues = np.array([y1, y2, y3, ..., y1000]) 
zvalues = np.array([z1, z2, z3, ..., z1000]) 

est la meilleure chose à faire pour construire un (3, 1000) tableau numpy/matrice, puis prendre le produit scalaire tenseur pour chaque paire?

v1 = np.array([x1,y1,z1]) 
v2 = np.array([x2,y2,z2]) 
... 

Je suis sûr qu'il ya une façon plus traitable et efficace de le faire ...

PS: Pour être clair, je voudrais prendre un produit scalaire 3D. Autrement dit, pour les vecteurs

A = (a1, a2, a3) et B = (b1, b2, b3),

le produit scalaire doit être

dotProduct (A, B) = a1b1 + a2b2 + a3b3.

Répondre

0

IIUC, vous pouvez construire le tableau intermédiaire comme vous le suggérez:

>>> arr = np.vstack([xvalues, yvalues, zvalues]).T 
>>> out = arr.dot(arr.T) 

qui semble être ce que vous voulez:

>>> out.shape 
(1000, 1000) 
>>> out[3,4] 
1.193097281209083 
>>> arr[3].dot(arr[4]) 
1.193097281209083 
+0

Ou un peu plus compacte: 'arr = np.array ([XValues, zvalues, valeurs y]); out = arr.T.dot (arr) ' – hpaulj

0

Donc, vous n'êtes pas loin avec votre pensée initiale . Il y a très peu de frais généraux impliqués dans la concaténation des tableaux, mais si vous êtes intéressé à faire dans numpy, il y a un ensemble intégré de fonctions, vstack, hstack, et dstack qui devrait fonctionner exactement comme vous le souhaitez. (Verticale, horizontale et la profondeur respectivement)

Je vais laisser à vous de déterminer qui vous où, mais voici un exemple sans vergogne volé la documentation pour vous aider à démarrer:

>>> a = np.array([1, 2, 3]) 
>>> b = np.array([2, 3, 4]) 
>>> np.vstack((a,b)) 
array([[1, 2, 3], 
     [2, 3, 4]]) 

Pour référence: vstack docs, hstack docs, et dstack docs

S'il est un peu excentrique d'avoir trois fonctions distinctes ici, alors vous avez raison!C'est pourquoi numpy a également la fonction concatenate. C'est juste une généralisation de vstack, hstack, et dstack qui prend un argument axis.

>>> a = np.array([[1, 2], [3, 4]]) 
>>> b = np.array([[5, 6]]) 
>>> np.concatenate((a, b), axis=0) 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 

Concatenate docs

+0

Je n'étais pas sûr de savoir comment" répondre à la question ". Vous avez tous deux répondu en même temps. Je déteste cette fonctionnalité de StackOverflow ... il devrait y avoir un moyen de connaître les deux commentateurs. Merci quand même! Grande et informative réponse! – ShanZhengYang