NUMPY умножить строки на последующие строки массива, используя значения продукта предыдущей строки в качестве входных данных - PullRequest
0 голосов
/ 12 января 2019

предположим, что ниже массив numpy

import numpy as np
array_a = np.arange(1,10).reshape(3,3)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

как я могу итеративно умножить предыдущую строку на следующую строку без использования цикла (значение предыдущей строки, кроме строки = 0, является продуктом умножения).

например, желаемый результат для вышеупомянутого array_a будет

[[1,   2,  3
 [4,  10, 18]
 [28, 80, 162]]

Мне известны такие функции умножения матриц, как np.dot и np.einsum, но я не могу сформулировать свою проблему, где я могу использовать эти функции. Решение в пандах, если оно есть, также приветствуется. спасибо за любое руководство.

1 Ответ

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

np.cumprod - отличный вариант, если вам нужно только умножить.

import numpy as np
array_a = np.arange(1,10).reshape(3,3)
array_b = np.cumprod(array_a, axis=0)

Еще один довольно эффективный вариант - использовать генератор. это немного медленнее, но также более текстильно

def generator(arr):
    cnt_up = len(arr)
    cnt_down = 0

    if cnt_down == 0:
        yield arr[0]

    while cnt_up > 1:
       cnt_up -= 1
       cnt_down += 1
       yield arr[cnt_down-1] * arr[cnt_down]

gen = generator(array_a)
array_b = np.stack([g for g in gen])

последний вариант - использовать рекурсию для других операций (что будет намного медленнее, поэтому np.cumpcrod / generator предпочтительнее)

import numpy as np

array_a = np.arange(1,10).reshape(3,3)


def recursive(arr):
    if len(arr) <= 1:
        return arr
    else:
        return arr[-1] * recursive(arr[:-1])


array_b = np.stack([recursive(array_a[:i])[0] for i in range(1, len(array_a)+1)])

второй способ, если вы хотите использовать другую пользовательскую формулу.

я использовал% timeit, я получил:

3 нсек для комка,

9 нсек для опции генератора,

25 нано секунд для рекурсии

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