我有一个数组(称为图像),我想要循环并使用numpy.roll函数进行调整。我还想存储我即将调整的行的副本。这是我的代码:
for i in range(1, 10):
delta = function(i) ### it's not important what this function is, just that it yields an int
x0 = image[i] ### creating a variable to store the row before I change it
print x0[:20] ###only printing the first 20 elements, as it's a very large array
image[i] = np.roll(x0, -delta)
print image[i][:20] ###image[i] has now been updated using np.roll function
if np.array_equal(image[i], x0) == True:
print 'something wrong'
现在是奇怪的事情发生的时候:当我运行这段代码时,我可以看到x0和image [i]非常不同(因为每个元素的前20个元素都被打印到屏幕上)。然而,我也在屏幕上打印出“错误”,这非常令人困惑,因为这实现了x0和image [i]相等。这是一个问题,因为我的脚本的其余部分依赖于x0并且image [i]不相等(除非delta = 0),但脚本总是将它们视为它们。
帮助表示赞赏!
答案 0 :(得分:3)
答案 1 :(得分:0)
这说明了小数组中发生了什么:
In [9]: x = np.arange(12).reshape(3,4)
In [10]: x
Out[10]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [11]: x0=x[0]
In [12]: x[0] = np.roll(x0, 1)
In [13]: x
Out[13]:
array([[ 3, 0, 1, 2],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [14]: x0
Out[14]: array([3, 0, 1, 2])
此处x0
只是x[0]
的另一个名称。在x[0]
中也可以看到对x0
的更改。 x0
更改了In [12]
,可以通过2次打印进行验证。
做同样的事,但要x0
一份副本
In [15]: x0=x[1].copy()
In [16]: x[1] = np.roll(x0, 1)
In [17]: x
Out[17]:
array([[ 3, 0, 1, 2],
[ 7, 4, 5, 6],
[ 8, 9, 10, 11]])
In [18]: x0
Out[18]: array([4, 5, 6, 7])
无副本案例与:
相同In [19]: x[2] = np.roll(x[2], 1)
In [20]: x
Out[20]:
array([[ 3, 0, 1, 2],
[ 7, 4, 5, 6],
[11, 8, 9, 10]])
答案 2 :(得分:-1)