我尝试迭代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}$但是,生成的数组看起来与初始数组完全相同。。。在
我对编程比较陌生,在这件事上我已经坚持了一段时间。如果有人能给我一个如何解决问题的提示,最好是一个简短的解释,那就太棒了。谢谢您!!在
我认为
nditer
需要一个更强的免责声明。对于初学者来说,这不是一个好的迭代工具。它很难正确使用,而且不是特别快。这个Python版本实际上是在编译代码中使用它的垫脚石,如主nditer
页面末尾的cython
示例所示:https://docs.scipy.org/doc/numpy/reference/arrays.nditer.html
有一些更快的方法可以进行这种数组计算,但我将尝试解释为什么您的
nditer
不起作用。在问题在于基本的Python迭代。循环中类似:
alist
未修改。element=1
只重新分配element
变量,但不修改迭代变量本身。相反,如果可能的话,element
本身发生了变异。在对于
^{pr2}$nditer
,迭代变量本身就是ndarray
,并且是可变的:如果这一点不清楚,请仔细查看https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html中的示例。请注意使用
out
参数和x[:] = [-1, -2, -3]
等表达式。在如果这种关于变异变量的讨论令人困惑,那么这很好地说明
nditer
在这一点上是一个过于先进的工具。在如果您想将转换应用于}所需的值,请参见代码:
numpy.array
的每个单元格,那么numpy.vectorize
就是合适的工具。 首先您需要函数,它将使用单个单元格的内容作为输入,它本身将被馈送到vectorize
和{输出(可能会有点不同,因为它是部分随机的):
^{pr2}$正如您所看到的,它对所有值都起到了预期的效果。注意,我添加了“donothing to element”行为(
return x
)作为安全措施,以防元素大于1
。在有关
numpy.vectorize
的更多信息,请阅读documentation。在编辑:修正了评论中报告的问题,问题是},而它应该总是
f
有时return
edint
,有时{return
float
。在相关问题 更多 >
编程相关推荐