根据numpy数组的值改变单个元素

2024-04-23 17:17:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试迭代numpy数组的每个元素,并以半随机的方式更改其值。原因是,我将把这个方法应用于不同的数组:我希望它们被更改,但我不希望它们以相同的方式更改。在

以下是我目前所做的尝试:

with np.nditer(smatrix, op_flags=['readwrite']) as it:
    for element in it:
        if element < 0:
            element = element - uniform(0.1,0.2)
        if 0 <= element < 0.05:
            element = uniform(0.15,0.3)
        elif 0.05 <= element < 1:
            element = 0
        elif 1 == element:
            element = 1

另一种可能性是:

^{pr2}$

但是,生成的数组看起来与初始数组完全相同。。。在

我对编程比较陌生,在这件事上我已经坚持了一段时间。如果有人能给我一个如何解决问题的提示,最好是一个简短的解释,那就太棒了。谢谢您!!在


Tags: 方法numpy元素ifwithnp方式原因
2条回答

我认为nditer需要一个更强的免责声明。对于初学者来说,这不是一个好的迭代工具。它很难正确使用,而且不是特别快。这个Python版本实际上是在编译代码中使用它的垫脚石,如主nditer页面末尾的cython示例所示:

https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

有一些更快的方法可以进行这种数组计算,但我将尝试解释为什么您的nditer不起作用。在

问题在于基本的Python迭代。循环中类似:

alist = [0,0,0]
for element in alist:
    element = 1

alist未修改。element=1只重新分配element变量,但不修改迭代变量本身。相反,如果可能的话,element本身发生了变异。在

对于nditer,迭代变量本身就是ndarray,并且是可变的:

^{pr2}$

如果这一点不清楚,请仔细查看https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html中的示例。请注意使用out参数和x[:] = [-1, -2, -3]等表达式。在

如果这种关于变异变量的讨论令人困惑,那么这很好地说明nditer在这一点上是一个过于先进的工具。在

如果您想将转换应用于numpy.array的每个单元格,那么numpy.vectorize就是合适的工具。 首先您需要函数,它将使用单个单元格的内容作为输入,它本身将被馈送到vectorize和{}所需的值,请参见代码:

import numpy as np
import random
def f(x):
    if x < 0:
        return x-random.uniform(0.1,0.2)
    if 0 <= x < 0.05:
        return random.uniform(0.15,0.3)
    if 0.05 <= x < 1:
        return 0.0
    if x == 1:
        return 1.0
    return x
vf = np.vectorize(f)

data = np.array([-4.3,0.03,0.9,1.0,1.9])
altered_data = vf(data)

输出(可能会有点不同,因为它是部分随机的):

^{pr2}$

正如您所看到的,它对所有值都起到了预期的效果。注意,我添加了“donothing to element”行为(return x)作为安全措施,以防元素大于1。在

有关numpy.vectorize的更多信息,请阅读documentation。在

编辑:修正了评论中报告的问题,问题是f有时returnedint,有时{},而它应该总是returnfloat。在

相关问题 更多 >