2015-04-22 2 views
1

Это моя цель, используя Python Numpy:Python, создавая большую одномерную матрицу 3-мерных продуктов точечных

Я хотел бы создать (1000,1000) одномерный массив/матрицу точечных значений продукции. Это означает, что каждый элемент массива/матрица является скалярное произведение векторов 1 до 1000. Построение теоретически это просто: один определяет (1,1000) мерную матрицу векторов v1, v2, ..., V1000

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

и принимает скалярное произведение с транспонированной, т.е.

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

и форма массива/матрица будет (1000, 1000). Запись (1,1) будет точечным произведением векторов (v1, v1), запись (1,2) будет точечным произведением векторов (v1, v2) и т. Д. Для вычисления точечного произведения с numpy для трехмерного вектора, целесообразно использовать numpy.tensordot() вместо numpy.dot()

Вот моя проблема: я не начинаю с массива векторных значений. Я начинаю с трех 1000 массивов элементов каждого значения координат, т. Е. Массива x-координат, y-координат и z-координат.

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

проще всего сделать, чтобы построить (3, 1000) Numpy массив/матрицы, а затем взять скалярное произведение тензорное для каждой пары?

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

Я уверен, что есть более сговорчивый и эффективный способ сделать это ...

PS: Для того, чтобы были ясны, я хотел бы взять 3D скалярного произведения. То есть, для векторов

А = (а1, а2, а3) и В = (b1, b2, b3),

скалярное произведение должно быть

DotProduct (А, В) = a1b1 + a2b2 + a3b3.

ответ

0

IIUC, вы можете создать промежуточный массив, как вы предложили:

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

который, кажется, что вы хотите:

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

или слегка более компактно: 'обр = np.array ([xvalues, zvalues,, Y.]); out = arr.T.dot (arr) ' – hpaulj

0

Таким образом, вы не далеко от вашей первоначальной мысли , В конкатенации массивов очень мало накладных расходов, но если вы заинтересованы в работе в пределах numpy, есть встроенный набор функций, vstack, hstack и dstack, которые должны выполняться точно так, как вы пожелаете. (Вертикальная, горизонтальная и глубина соответственно)

Я оставлю это до вас, чтобы определить, какие вам где, но вот пример бесстыдно украдена из Документов, чтобы помочь вам начать работу:

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

Для справки: vstack docs, hstack docs и dstack docs

Если у вас есть несколько верхних частей, здесь есть три отдельных функции, тогда вы правы!Именно поэтому также имеет функцию concatenate. Это всего лишь обобщение vstack, hstack и dstack, которое принимает аргумент 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

Я не был уверен, как« ответить на вопрос ». Вы оба ответили одновременно. Я ненавижу эту функцию StackOverflow ... должен быть способ знать обоих комментаторов. Однако, спасибо! Отличный и информативный ответ! – ShanZhengYang

Смежные вопросы