Векторизованная операция массива, с исключением элементов массива по очереди - PullRequest
0 голосов
/ 09 января 2019

Я ищу наиболее эффективный метод в Python для определенного вида векторных операций, скажем,

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

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

a = [ 1, 2, 3, 4]
b = [ 1, 0, -1, 2]

Что я хотел бы сделать, так это создать новый массив c такой же формы, чтобы

c[i] = ( sum of a[j]*b[j] while j!=i )

Threfore урожайности

c = [ 5, 6, 9, -2]

Это не такая сложная проблема, если мы используем несколько циклов for, но она может быть медленной для очень больших массивов. Я слышал, что использование маскированного массива np.ma дает некоторую помощь, но кажется, что метод все еще требует итеративной маскировки каждого элемента.

Интересно, есть ли какой-нибудь другой метод, более быстрый, чем этот, особенно с использованием векторизованных форм операций?

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Используйте NumPy, конечно:

In [3]: import numpy as np

In [4]: a = np.array([1, 2, 3, 4])

In [5]: b = np.array([1, 0, -1, 2])

In [6]: c = a * b

In [7]: c = c.sum() - c

In [8]: c
Out[8]: array([ 5,  6,  9, -2])
0 голосов
/ 09 января 2019

Не уверен, есть ли способ сделать это простым обалденным (держу пари). Но пока вы имеете дело с итерациями, ваш путь - это итератор суммы и понимание списка.

nsize = 500
a = np.random.randint(-3, 8, nsize)
b = np.random.randint(-3, 8, nsize)

Первой идеей была бы простая петля for. Решение будет выглядеть так:

c = list()
for i in range(nsize):
    sum_entry = 0
    for j in range(nsize):
        if not j == i:
            sum_entry += a[j] * b[j]
    c.append(sum_entry)

Для nsize = 500 это заняло 0,098 с.

Более быстрый и более питонический способ сочетания итератора сумм и понимания списка:

c = [sum(a[j]*b[j] for j in range(nsize) if not j == i) for i in range(nsize)]

nsize = 500 заняло у меня 0,075 с, поэтому на 30% быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...