Python,两个变量应该是不同的,但它们保持不变 - 是np.roll to blame?

时间:2017-03-15 19:52:04

标签: python numpy

我有一个数组(称为图像),我想要循环并使用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),但脚本总是将它们视为它们。

帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

  

我还想存储我即将调整的行的副本

如果您想要副本,x0 = image[i]不是您想要的。这样可以查看行,而不是副本。如果您需要副本,请致电copy

x0 = image[i].copy()

答案 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)

您应该更改如下,您的问题将得到解决

for i in range(1, 10):
    delta = function(i)     

    x0 =  list(image[i])    

    print x0[:20]      

    image[i] = np.roll(x0, -delta)

    print image[i][:20] 

if np.array_equal(image[i], x0) == True:
    print 'something wrong'

让我们假设x0 - > a和图像[i] - > b x0 =图像[i]

enter image description here