Home > Mobile >  Why do I get zero here? Assigning array elements
Why do I get zero here? Assigning array elements

Time:07-30

Why does this

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
a_old = a[0]
a[0] = a[0]   np.array([1,1,1])
print(a[0] - a_old)

give

[0 0 0]

and not

[1 1 1]

? But on the other hand

b = 2
b_old = b
b = b   1
print(b - b_old)

gives indeed

1

as I would expect. I suppose there is a difference between assigning something to np.array elements, and assigning something to a variable. But I don't quite see through it. Thanks for help!

CodePudding user response:

This can be tricky in numpy! It's because that when you do a_old = a[0], you are creating a view of the data in a, not a copy of the data. To quote the numpy indexing documentation:

It must be noted that the returned array is a view, i.e., it is not a copy of the original, but points to the same values in memory as does the original array.

So when you add to the original array: a[0] = a[0] np.array([1,1,1]), the "value" of a_old changes as well since a_old points to the same location in memory. If you want to create a copy, you can simply edit your code:

a_old = a[0].copy()

In your floating point example, b_old = b copies the value of b to a new point in memory, so b and b_old can be changed without affecting one another.

CodePudding user response:

This happens because in Python, as well as other programming languages, lists are Reference type. So, the value stored in a[0], isn't the list but it's a memory address where the list is stored.

So, the instruction a_old = a[0], copy the address of a[0] in a_old, and both the variables will reference the same list.

Instead, doing b_old = b, you're copying the value 2 directly.

To notice this, try running print(a_old is a[0]), you should see True.

Now, to solve your problem, you can run a_old = a[0].copy(). After this, print(a_old is a[0]) will output False, because the reference of the two variables are different.

  • Related