nietzschetmh
nietzschetmh

Reputation: 69

Python numpy index

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.

Upvotes: 0

Views: 89

Answers (1)

mgilson
mgilson

Reputation: 310297

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]

Upvotes: 2

Related Questions