Python在While循环中更改数组值

时间:2016-05-30 18:53:02

标签: python arrays loops numpy

我正在开发一个项目,其中我有以下循环:

i = 0 
while i <= length:
    u[:,i] = u[:,i] - u_val
    y[:,i] = y[:,i] - y_val
    i = i + 1

目标是沿着每个数组的整个长度从各自的数组中减去u_val和y_val。 y和u都具有相同的长度,u的维度为2,y的维度为1。

u和y来自数组“数据”,由以下内容定义:

u = data[1:1+ni]
y = data[1+ni:1+ni+no]

u_val和y_val也来自“数据”,由以下人员定义:

u_ss = data[1:1+ni,0]
y_ss = data[1+ni:1+ni+no,0]

u_val = array([0.04,550000.0])和y_val = array([400.153])

第一个循环使用从每个数组的第一个值中减去的值,但是python设置u_val = array([0。0。])和y_val = array([0。])。因此循环继续运行,但现在从所有内容中减去零。我查看了变量资源管理器,由于某种原因,循环也将数组“data”上的原始条目更改为零。为什么循环会这样做?

我已经重启了几次,我也尝试过它作为for循环。我无法弄清楚循环中是什么触发原始数组中的更改。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

data[1:1+ni,0]view个数据。 data[1:1+ni]也是如此(也可以表示为data[1:1+ni, :])。如果更改一个视图的元素(如u[:,i] = u[:,i] - u_val),则更改data中的相应元素,以及包含该元素的任何其他视图。因此,如果不排除所有切片范围,我可以看到此计算最终可能会更改u_val的值。

您可能需要制作一些副本,例如

u_val = data[1:1+ni,0].copy()

u_valu(和data)中的更改隔离开来。

了解副本和视图是使用numpy的基础。

不能

i = 0 
while i <= length:
    u[:,i] = u[:,i] - u_val
    y[:,i] = y[:,i] - y_val
    i = i + 1

替换为:

u -= u_val[:,None]
y -= y_val[:,None]

我添加了None以扩展u_val的维度,以便它可以针对2d u进行广播。如果这不起作用,请查看uu_val等的形状。

相关问题