我正在开发一个项目,其中我有以下循环:
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循环。我无法弄清楚循环中是什么触发原始数组中的更改。谢谢你的帮助!
答案 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_val
与u
(和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
进行广播。如果这不起作用,请查看u
和u_val
等的形状。