Есть ли эффективный способ вычислить скалярное произведение двух 3D векторов из индекса массива?

#python #algorithm #dot-product

#python #алгоритм #скалярное произведение

Вопрос:

Я выполняю следующее скалярное произведение двух 3D векторов:

 import numpy as np

Nk = 8
Ns = 15
k_box = np.zeros(Nk**3)
R_box = np.zeros(Ns**3)
for k in range(Nk**3):
        Kx = int(k / (Nk*Nk))
        Ky = int(k / Nk) % Nk
        Kz = k % Nk
        for R in range(Ns**3):
            Rx = int(R / (Ns*Ns))
            Ry = int(R / Ns) % Ns
            Rz = R % Ns
            # This is the only place these variables are used!
            dot_product = Rx*Kx   Ry*Ky   Rz*Kz
            k_box[k], R_box[R] = perform_some_calculation(dot_product)
  

Есть ли способ вычислить скалярное произведение без предварительного вычисления x, y, z компонентов явно? Преобразование этого в 6 циклов сработало бы, но выглядело бы грубо. Похоже, что для этого был бы трюк.

Возможно, мне также потребуется расширить это до некубических объемов, поэтому, если есть трюк, и он работает для общей геометрии коробки, это было бы идеально.

Комментарии:

1. Ваш код не имеет смысла, поскольку ваш внутренний цикл просто повторно пересчитывает значение value — каждый раз другое значение, но где-либо сохраняется только последнее. Есть ли где-нибудь массив, или список, или кортеж, или простой контейнер данных? Пожалуйста, объясните свой вопрос более четко.

2. Да, я отредактирую код, чтобы было более понятно, что я делаю. Я просто пытался включить только соответствующие части.

3. @ColinB: Есть какая-то конкретная причина, по которой вы преобразуете свои арифметические результаты в целые числа (используя int() )? будет ли все в порядке, если я буду использовать их в качестве значений с плавающей запятой?

4. @ColinB: Ваш вопрос таков: «Есть ли способ вычислить скалярное произведение без предварительного вычисления компонентов x, y, z явно? «. Если это действительно ваш вопрос, то это не в моей компетенции, и я могу только (неуверенно) указать вам на альтернативное определение точечного произведения (произведение величин векторов и косинуса угла между ними). Но если ваш вопрос касается уменьшения количества видимых циклов, я могу предложить какое-то решение. Пожалуйста, уточните.

Ответ №1:

Скалярное произведение должно быть выполнено следующим образом

 import numpy as np

R = np.array([Rx,Ry,Rz])
K = np.array([Kx,Ky,Kz])
value = np.dot(R,K)
  

Комментарии:

1. Это не отвечает на мой вопрос.

2. что делает последняя строка внутри цикла for?