python 三角形阵列_Python中的高效阵列替换

这篇博客探讨了如何高效地用数组中其他随机值替换不符合特定条件的元素。作者提供了一个低效的解决方案,即遍历数组并逐个检查和替换元素,然后提出了一种更快速的方法,通过提取符合条件的值,使用`random.choice()`在需要时选择替换值。通过实测,新方法的性能提高了约十倍。博客强调了利用Python的高级特性来减少循环和提高代码效率的重要性。
摘要由CSDN通过智能技术生成

我想知道在给定一些标准的情况下,用阵列中的其他随机元素替换数组中元素的最有效方法是什么.更具体地说,我需要用该行中的另一个随机值替换不符合给定条件的每个元素.例如,我想将每行数据替换为数据(行)中的随机单元格,该单元格介于-.8和.8之间.我的inefficinet解决方案看起来像这样:

import numpy as np

data = np.random.normal(0, 1, (10, 100))

for index, row in enumerate(data):

row_copy = np.copy(row)

outliers = np.logical_or(row>.8, row

for prob in np.where(outliers==1)[0]:

fixed = 0

while fixed == 0:

random_other_value = r.randint(0,99)

if random_other_value in np.where(outliers==1)[0]:

fixed = 0

else:

row_copy[prob] = row[random_other_value]

fixed = 1

显然,这并不高效.

解决方法:

我认为提取所有好的值会更快,然后使用random.choice()在需要时选择一个.像这样的东西:

import numpy as np

import random

from itertools import izip

data = np.random.normal(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 = np.array([x if f else random.choice(good) for f, x in izip(good_ones, row)])

您编写的高级Python代码比Python的C内部慢.如果你可以将工作推进C内部,通常会更快.换句话说,尽量让Python为你做繁重的工作,而不是编写大量的代码.它是禅…编写更少的代码来获得更快的代码.

我添加了一个循环来运行你的代码1000次,并运行我的代码1000次,并测量他们执行的时间.根据我的测试,我的代码快了十倍.

此代码正在执行的操作的其他说明:

正在通过构建新列表来设置row_copy,然后在新列表上调用np.array()以将其转换为NumPy数组对象.新列表由列表理解构建.

新列表是根据规则制定的:如果数量良好,请保留;否则,从好的价值观中随机选择.

列表推导会遍历一系列值,但要应用此规则,我们需要两个值:数字和标记,表明该数字是否良好.使列表理解同时沿着两个序列行走的最简单和最快捷的方法是使用izip()将两个序列“压缩”在一起. izip()将产生元组,一次一个,元组是(f,x); f在这种情况下是标志说好或不,x是数字. (Python有一个名为zip()的内置功能,它几乎完全相同,但实际上构建了一个元组列表; izip()只是产生一个产生元组值的迭代器.但你可以使用zip()来实现一个Python提示,以了解它的工作原理.)

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

a, b = (2, 3)

在这个例子中,我们将a设置为2,将b设置为3.在列表推导中,我们将元组从izip()解包为变量f和x.

然后列表理解的核心是“三元if”语句,如下所示:

a if flag else b

如果标志值为true,则上面将返回值a,否则返回b.这个列表理解中的一个是:

x if f else random.choice(good)

这实现了我们的规则.

标签:python,arrays,replace,numpy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值