Why does an assignment for double-sliced numpy arrays not work?

前端 未结 4 2545
甜味超标
甜味超标 2021-02-20 05:18

why do the following lines not work as I expect?

import numpy as np
a = np.array([0,1,2,1,1])
a[a==1][1:] = 3
print a
>>> [0 1 2 1 1]
# I would expect [         


        
相关标签:
4条回答
  • 2021-02-20 05:32

    Because the a[a==1] part isn't actually a slice. It creates a new array. It makes sense when you think about it-- you're only taking the elements that satisfy the boolean condition (like a filter operation).

    0 讨论(0)
  • 2021-02-20 05:49

    It appears you simply can't do an assignment through a double-slice like that.

    This works though:

    a[numpy.where(a==1)[0][1:]] = 3
    
    0 讨论(0)
  • 2021-02-20 05:49

    This does what you want

    a[2:][a[2:]==1]=3
    
    0 讨论(0)
  • 2021-02-20 05:55

    It's related to how fancy indexing works. There is a thorough explanation here. It is done this way to allow inplace modification with fancy indexing (ie a[x>3] *= 2). A consequence of this is that you can't assign to a double index as you have found. Fancy indexing always returns a copy rather than a view.

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