数组乘法乘以值的出现,而不是值本身

问题描述 投票:0回答:3

我编写了以下Python代码:

numbers = [42, 4224, 42422424, -250]
products = numbers*157
products

这将导致以下输出:

42,
 4224,
 42422424,
 -250,
 42,
 4224,
 42422424,
 -250,
 42,
 4224,
 42422424,
 -250,

等:此顺序重复了几次,可能是157次。

为什么此代码不将每个数组元素乘以157?这应该是:

[6594, 663168, 6660320568, -39250]
python
3个回答
2
投票

将列表乘以任何常量c将使列表中的元素重复c次。

[为了更好地了解这里发生的情况,您应该先将列表乘以一个较小的常量,最后逐步达到157。让我们先将列表乘以1:]]

products = numbers*1
print(products)                                                         
[42, 4224, 42422424, -250]

我们可以看到将列表乘以1只会将我们发送回原始列表,因为元素仅在列表中包含一次。接下来,我们将列表乘以2:

products = numbers*2
print(products)                                                        
[42, 4224, 42422424, -250, 42, 4224, 42422424, -250]

我们可以看到元素在同一列表中重复了两次。您可以自行增加常数,以观察重复次数的增加。


正如其他人所建议的,您可以简单地使用列表理解

numpy数组检索所需的输出:

方法1:列表理解

products = [i*157 for i in numbers]
print(products)                                                        
[6594, 663168, 6660320568, -39250]

列表理解本质上是编写循环的简写,在我们的情况下,该循环将每个单独的元素乘以157。

方法2:numpy数组

products = np.array(numbers)*157
print(products)
array([6594, 663168, 6660320568, -39250])

Numpy是用于数组处理和数据处理的模块。您可以阅读有关numpy here的好处的更多信息。

性能测试

我将在下面包括一些性能差异。这也是一个很好的示例,包括将列表乘以常数并将列表的元素乘以常数。

>>> timeit.timeit('[i*157 for i in numbers]', 'numbers=[42, 4224, 42422424, -250]', number=1000000)
0.35015837100013414
>>> timeit.timeit('numbers*157', 'import numpy as np;numbers=np.array([42, 4224, 42422424,-250])', number=1000000)
0.639420188000031
>>> timeit.timeit('[i*157 for i in numbers]', 'numbers=[42, 4224, 42422424,-250]*500', number=1000000)
91.96342155899993
>>> timeit.timeit('numbers*157', 'import numpy as np;numbers=np.array([42, 4224, 42422424,-250]*500)', number=1000000)
1.3476544480001849

通常,对于较大的类似数组的数据,numpy数组的性能要优于普通的Python列表。但是,在某些情况下,Python列表的性能要优于numpy数组,您可以阅读有关here的更多信息。


1
投票

为什么此代码不将每个数组元素乘以157?


0
投票

您想通过numpy数组实现。在普通列表数组中,执行numbers * 157将执行您获得的重复。对于您想要的输出,

© www.soinside.com 2019 - 2024. All rights reserved.