need more elaborative explanation for indexed array used as rvalue or lvalue
I'm in the process of reading the book for python machine learning (PML). And I followed the PML to learn more about numpy through the Appendix F of this book.
For section F.6, it covers fancy indexing will always return a copy of ndarray. But in section F.7 it shows you can do the assignment to fancy indexed array and the result will be written to the original array. I'm confused.
>>> ary[mask] = 1
>>> ary[~mask] = 0
>>> ary array([0, 0, 1, 1])
That's not consistent with fancy indexing should return a copy instead of a view of the array. If arr[mask] returns a copy, then the following assignment will assign results to the copy instead of the source.
After I did some research, I found the post here explains everything.
When you do c = a[b], a.__get_item__ is called with b as its only argument, and whatever gets returned is assigned to c.
When you doa[b] = c, a.__setitem__ is called with b and c as arguments and whatever gets returned is silently discarded.
I hope @rasbt can elaborately mention the python implementation difference of indexed array being used as rvalue and lvalue.
Thanks for highlighting this unintuitive behavior. It's definitely worth explaining with regard to left- and right-value.
E.g., when we have
import numpy as np
a = np.array([1, 2, 3, 4, 5])
a[[1, 3]] = 99
a
it returns
array([ 1, 99, 3, 99, 5])
but if we have the fancy indexing on the right, it creates a copy:
a = np.array([1, 2, 3, 4, 5])
b = a[[1, 3]]
b += 99
a
array([1, 2, 3, 4, 5])
Will leave this issue open to remind myself to update the document in the upcoming days/weeks.
Perfect! Thanks!