Python - умножение элементов списка без циклов - PullRequest
0 голосов
/ 03 мая 2020

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

import numpy as np
def foo(n):
    return(365-n)/365
#lim is some integer greater than 0 and less than 365
lim = 50
x = np.arange(0, lim, 1)
#foo(n) is some function
y = foo(x)
z = np.zeros(np.shape(x))
#z is the variable I'm trying to create
for i in x:
    z[i] = 1 - np.prod(y[0:i+1])

Кто-нибудь знает, как написать без использования al oop? Почти все мне посоветовали избегать использования циклов в python, потому что это неэффективно и, как вы, вероятно, видите, я не очень опытный программист.

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Вы правы, что следует избегать циклов Python, если вы можете векторизовать вычисления. Нет никакой причины инициализировать z нулями. Ваш текущий вывод для z:

array([0.        , 0.        , 0.00273973, 0.00820417, 0.01635591,
       0.02713557, 0.04046248, 0.0562357 , 0.07433529, 0.09462383,...]

Я не уверен, что двойные значения 0 действительно желательны (я обновлю, если так). Самая простая замена для текущего подхода - просто использовать numpy.cumprod:

import numpy as np

def foo(n):
    return(365-n)/365

lim = 50
x = np.arange(0, lim, 1)

y = foo(x)
z = 1 - np.cumprod(y)
0 голосов
/ 03 мая 2020

вы можете сделать для одной строки

z = [(1 - np.prod(y[0:i])for i in x)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...