Python numpy index
Question: i have a numpy array p like this:

    
    
    array([[ 0.92691702,  0.07308298],
       [ 0.65515095,  0.34484905],
       [ 0.32526151,  0.67473849],
       ..., 
       [ 0.34171992,  0.65828008],
       [ 0.77521514,  0.22478486],
       [ 0.96430103,  0.03569897]])
    

If i do x=p[:,1:2], i would get

`array([[ 0.07308298], [ 0.34484905], [ 0.67473849], ..., [ 0.65828008], [
0.22478486], [ 0.03569897]])` and x.shape is (5500,1)

However, if i do x=p[:,1], i would get

    
    
    array([ 0.07308298,  0.34484905,  0.67473849, ...,  0.65828008,
        0.22478486,  0.03569897])
    

and x.shape is (5500, )

Why there is difference like this? It quite confuses me. Thanks all in advance
for your help.


Answer: It's the difference between using a slice and a single integer in the
`ndarray.__getitem__` call. Slicing causes the ndarray to return _"views"_
while integers cause the ndarray _values_.

I'm being a little loose in my terminology here -- Really, for your case they
both return a numpy view -- It's easier to consider just the 1D case first:

    
    
    >>> import numpy as np
    >>> x = np.arange(10)
    >>> x[1]
    1
    >>> x[1:2]
    array([1])
    

This idea extends to multiple dimensions nicely -- If you pass a slice for a
particular axis, you'll get "array-like" values along that axis. If you pass a
scalar for a particular axis, you'll get scalars along that axis in the
result.

Note that the 1D case really isn't any different from how a standard python
`list` behaves:

    
    
    >>> x = [1, 2, 3, 4]
    >>> x[1]
    2
    >>> x[1:2]
    [2]
    

