Does assignment with advanced indexing copy array data?

后端 未结 3 461
南笙
南笙 2020-12-09 05:11

I am slowly trying to understand the difference between views and copys in numpy, as well as mutable vs. immutable types.

If I access part

相关标签:
3条回答
  • 2020-12-09 05:20

    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.

    So despite having the same a[b] syntax, both expressions are doing different things. You could subclass ndarray, overload this two functions, and have them behave differently. As is by default in numpy, the former returns a copy (if b is an array) but the latter modifies a in place.

    0 讨论(0)
  • 2020-12-09 05:36

    Yes, it is the same object. Here's how you check:

    >>> a
    array([[ 0.,  0.,  0.],
           [ 0.,  0.,  0.],
           [ 0.,  0.,  0.]])
    >>> a2 = a
    >>> a[b] = 1
    >>> a2 is a
    True
    >>> a2
    array([[ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.]])
    

    Assigning to some expression in Python is not the same as just reading the value of that expression. When you do c = a[b], with a[b] on the right of the equals sign, it returns a new object. When you do a[b] = 1, with a[b] on the left of the equals sign, it modifies the original object.

    In fact, an expression like a[b] = 1 cannot change what name a is bound to. The code that handles obj[index] = value only gets to know the object obj, not what name was used to refer to that object, so it can't change what that name refers to.

    0 讨论(0)
  • 2020-12-09 05:38

    This seems to be common misunderstanding, quoting from the official document: (https://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html)

    The rule of thumb here can be: in the context of lvalue indexing (i.e. the indices are placed in the left hand side value of an assignment), no view or copy of the array is created (because there is no need to). However, with regular values, the above rules for creating views does apply.

    In other words, the notion of view or copy only refers to the situation of retrieving values from a numpy object.

    0 讨论(0)
提交回复
热议问题