【问题标题】:Python - list elements multiplication without loopsPython - 没有循环的列表元素乘法
【发布时间】:2020-05-03 14:43:56
【问题描述】:

我正在尝试通过以下方式创建一个 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])

有人知道如何在不使用循环的情况下编写它吗?几乎每个人都建议我避免在 python 中使用循环,因为它效率低下,而且您可能会看到我不是一个非常熟练的程序员。

【问题讨论】:

  • 当这是另一种选择时,您可能会避免使用 for-loop,因为您将使用数百次,因为没有其他选择,不要每次都扔掉 forloop
  • 什么是limfoo 是什么?你是对的,如果可能的话应该避免循环,但你需要一个minimal reproducible example,这样我们就可以实际处理它
  • @azro 我完全听不懂你在说什么,抱歉
  • I was advised to avoid using loops in python :当你可以的时候。但是数百次你会使用循环,因为那是如何解决问题的
  • 某处会有一个for循环,但他们可能指的是一个显式的python循环。如果可以将其作为向量化操作推入 numpy 中,那就更可取了

标签: python numpy


【解决方案1】:

如果可以向量化计算,应该避免 Python 循环是正确的。没有理由用零初始化zz 的当前输出是:

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)

【讨论】:

  • 是的,非常感谢,这正是我想要的。 z[1] 不应该是 0 也是正确的,但我进行了编辑,产生了正确的序列。
【解决方案2】:

你可以在一行中做一个 for

z = [(1 - np.prod(y[0:i])for i in x)]

【讨论】:

  • 是的,感谢您的回复,但我并不想编写更短的代码。我在问是否有一些明显的方法可以避免这里的 for 循环。
猜你喜欢
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2021-03-29
  • 2014-02-27
相关资源
最近更新 更多