sabora
sabora

Reputation: 23

why there is deference between the output type of this two Numpy slice commands

The output of the two commands below gives a different array shape, I do appreciate explaining why and referring me to a reference if any, I searched the internet but did not find any clear explanation for it.

data.shape
(11,2)

# outputs the values in column-0 in an (1x11) array.
data[:,0] 

array([-7.24070e-01, -2.40724e+00,  2.64837e+00,  3.60920e-01,
        6.73120e-01, -4.54600e-01,  2.20168e+00,  1.15605e+00,
        5.06940e-01, -8.59520e-01, -5.99700e-01])


# outputs the values in column-0 in an (11x1) array
data[:,:-1] 


array([[-7.24070e-01],
       [-2.40724e+00],
       [ 2.64837e+00],
       [ 3.60920e-01],
       [ 6.73120e-01],
       [-4.54600e-01],
       [ 2.20168e+00],
       [ 1.15605e+00],
       [ 5.06940e-01],
       [-8.59520e-01],
       [-5.99700e-01]])

Upvotes: 0

Views: 50

Answers (1)

hpaulj
hpaulj

Reputation: 231385

I'll try to consolidate the comments into an answer.

First look at Python list indexing

In [92]: alist = [1,2,3]

selecting an item:

In [93]: alist[0]
Out[93]: 1

making a copy of the whole list:

In [94]: alist[:]
Out[94]: [1, 2, 3]

or a slice of length 2, or 1 or 0:

In [95]: alist[:2]
Out[95]: [1, 2]
In [96]: alist[:1]
Out[96]: [1]
In [97]: alist[:0]
Out[97]: []

Arrays follow the same basic rules

In [98]: x = np.arange(12).reshape(3,4)
In [99]: x
Out[99]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

Select a row:

In [100]: x[0]
Out[100]: array([0, 1, 2, 3])

or a column:

In [101]: x[:,0]
Out[101]: array([0, 4, 8])

x[0,1] selects an single element.

https://numpy.org/doc/stable/user/basics.indexing.html#single-element-indexing

Indexing with a slice returns multiple rows:

In [103]: x[0:2]
Out[103]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
In [104]: x[0:1]            # it retains the dimensions, even if only 1 (or even 0)
Out[104]: array([[0, 1, 2, 3]])

Likewise for columns:

In [106]: x[:,0:1]
Out[106]: 
array([[0],
       [4],
       [8]])

subslices on both dimensions:

In [107]: x[0:2,1:3]
Out[107]: 
array([[1, 2],
       [5, 6]])

https://numpy.org/doc/stable/user/basics.indexing.html

x[[0]] also returns a 2d array, but that gets into "advanced" indexing (which doesn't have a list equivalent).

Upvotes: 1

Related Questions