Mark
Mark

Reputation: 21

python np.array value change

I'm confused as to why the following two print(an_array) statements gives two different results.

Although b_slice is explicitly defined as a np.array during assignment,both a_slice and b_slice are of the same type using type command.Yet a-slice will change the value of an_array while b_slice will not. If someone could point me to the explanation I would greatly appreciate it.

an_array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a_slice = an_array[:2, 1:3]
print(type(a_slice)) # <class 'numpy.ndarray'>
print(type(b_slice)) # <class 'numpy.ndarray'>
b_slice = np.array(an_array[:2, 1:3]
b_slice[0,0] = 2000
print(an_array) # returns no change to an_array

[[1  2  3  4]
 [5  6  7  8]
 [9 10 11 12]]

a_slice[0,0] = 2000
print(an_array) # shows the change from the number 2 to the number 2000

[[1 2000 3  4]
 [5 6    7  8]
 [9 10  11 12]

Upvotes: 2

Views: 98

Answers (1)

juanpa.arrivillaga
juanpa.arrivillaga

Reputation: 95948

Because you explicitly* make a copy by calling the np.array constructor:

b_slice = np.array(an_array[:2, 1:3])

Whereas:

a_slice = an_array[:2, 1:3]

Is the result of a slice, which in numpy create views instead of shallow copies, unlike vanilla lists.

Note * as @hpaulj points out, the np.array constructor takes a copy argument, which defaults to True.

Upvotes: 3

Related Questions