python - discriminate basic and advanced slicing of numpy array -
i'm reading doc numpy array indexing, still unclear how discriminate basic , advanced slicing.
thanks if explain bit.
x[(1,2,3),]
fundamentally differentx[(1,2,3)]
. latter equivalentx[1,2,3]
trigger basic selection while former trigger advanced indexing. sure understand why occurs.also recognize
x[[1,2,3]]
trigger advanced indexing, whereas x[[1,2,slice(none)]]` trigger basic slicing.
start simple 1d array:
in [326]: x=np.arange(10)
these 2 expressions same thing - select 3 elements array. verify return copy, x[1:4]
returns view.
in [327]: x[(1,2,3),] out[327]: array([1, 2, 3]) in [328]: x[[1,2,3]] out[328]: array([1, 2, 3])
but without command, tuple raises error:
in [329]: x[(1,2,3)] ... indexerror: many indices array
same as:
in [330]: x[1,2,3] indexerror: many indices array
x[1,2,3]
converted python interpreter call x.__getitem__((1,2,3))
. is, input values passed tuple method. ()
in x[(1,2,3)]
make no difference. comma in first expression adds layer of nesting:
in [338]: ((1,2,3)) out[338]: (1, 2, 3) in [339]: ((1,2,3),) out[339]: ((1, 2, 3),)
x[[1,2,slice(none)]]
equivalent x[1,2,:]
, i'll have make 3d array verify this.
in [344]: x=np.arange(64).reshape(4,4,4)
3d indexing of single element:
in [345]: x[(1,2,3)] out[345]: 27 in [346]: x[1,2,3] out[346]: 27
3d, slice on last dimension:
in [347]: x[1,2,:] out[347]: array([24, 25, 26, 27])
the interpreter accepts :
notation in square indexing brackets:
in [348]: x[(1,2,:)] ... syntaxerror: invalid syntax
but slice
can write tuple or list
in [349]: x[(1,2,slice(none))] out[349]: array([24, 25, 26, 27]) in [350]: x[[1,2,slice(none)]] out[350]: array([24, 25, 26, 27])
tuple works here same reason did (1,2,3)
. think treating []
case same way because that's thing makes sense. combining numbers slice make advanced index not make sense.
there indexing trick lets me pick 2 items plus slice:
in [354]: x[np.r_[1,3, 6:10]] out[354]: array([1, 3, 6, 7, 8, 9])
but expanding slice range
in [353]: np.r_[1,3, 6:10] out[353]: array([1, 3, 6, 7, 8, 9])
Comments
Post a Comment