python数组中元素替换_Python中高效的数组替换

时间:2025-03-31 14:42:53

我认为提取所有好值会更快,然后在需要时使用()来选择一个。像这样:import numpy as np

import random

from itertools import izip

data = (0, 1, (10, 100))

for row in data:

good_ones = np.logical_and(row >= -0.8, row <= 0.8)

good = row[good_ones]

row_copy = ([x if f else (good) for f, x in izip(good_ones, row)])

您编写的高级Python代码比Python的C内部构件慢。如果您可以将工作向下推到C内部,通常会更快。换句话说,试着让Python为您完成繁重的工作,而不是编写大量代码。这是禅。。。编写更少的代码以获得更快的代码。在

我添加了一个循环来运行您的代码1000次,并运行了我的代码1000次,并测量了它们执行所需的时间。根据我的测试,我的代码快十倍。在

有关此代码的其他说明:

设置row_copy的方法是建立一个新列表,然后在新列表上调用(),将其转换为NumPy数组对象。新列表是通过列表理解构建的。在

新列表是根据规则生成的:如果数字是正确的,则保留它;否则,从好的值中随机选择一个。在

列表理解遍历一系列值,但要应用此规则,我们需要两个值:数字和表示该数字是否正确的标志。使一个列表理解同时沿着两个序列行走的最简单和最快的方法是使用izip()将两个序列“压缩”在一起。izip()将一次生成一个元组,其中元组是(f, x);f在本例中是表示好与否的标志,x是数字。(Python有一个名为zip()的内置特性,它做的基本相同,但实际上构建了一个元组列表;izip()只是生成一个迭代器,产生元组值。但是您可以在Python提示下使用zip(),以了解它是如何工作的。)

在Python中,我们可以将元组解压为变量名,如下所示:

^{pr2}$

在本例中,我们将a设置为2,将b设置为3。在列表理解中,我们将izip()中的元组解压为变量f和{}。在

如果“心”的三元陈述是这样的:a if flag else b

如果flag值为真,则上述函数将返回值a,否则返回b。这个列表中的理解是:x if f else (good)

这就实现了我们的规则。在

相关文章