1

I have an array:

arr = np.array([[1,2,3], [4,5,6], [7,8,9]])

If I slice the array arr[:, :1] my result is array([[1], [4], [7]]).

If I slice the array arr[:, 0] my result is array([1, 4, 7]).

Why is there a difference?

Mateen Ulhaq
  • 24,552
  • 19
  • 101
  • 135
Peter K
  • 21
  • 2

2 Answers2

4

:1 is a slice (which happens to be of length 1) so numpy returns a list for every line (first dim) in your array. This is why you have a 2-dimensional array as a result: you asked for a sub array with :.

0 on the other hand is an index so numpy shrinks the result by 1 dimension resulting of a list of values (array of dimension 1 more precisely).

ted
  • 13,596
  • 9
  • 65
  • 107
1

https://docs.scipy.org/doc/numpy-1.14.2/user/basics.indexing.html#single-element-indexing

claims that single element indexing behaves like the usual Python list indexing. Slicing also follows this pattern

In [175]: arr = np.arange(6).reshape(2,3)
In [176]: arr
Out[176]: 
array([[0, 1, 2],
       [3, 4, 5]])

single element indexing - returns a 1d array

In [177]: arr[1,:]
Out[177]: array([3, 4, 5])

slice indexing returns a 2d array

In [178]: arr[:1,:]
Out[178]: array([[0, 1, 2]])

with an equivalent list

In [179]: alist = arr.tolist()

single element indexing returns a list:

In [180]: alist[1]
Out[180]: [3, 4, 5]

slice indexing returns a nested list:

In [181]: alist[:1]
Out[181]: [[0, 1, 2]]

Same pattern holds when I index a 1d array, or list of numbers.

numpy generalizes this to columns, and higher dimensions, but tries to keep the pattern the same.

In [187]: arr[:,0]
Out[187]: array([0, 3])
In [188]: arr[:,:1]
Out[188]: 
array([[0],
       [3]])
In [189]: [x[0] for x in alist]
Out[189]: [0, 3]
In [190]: [x[:1] for x in alist]
Out[190]: [[0], [3]]
hpaulj
  • 221,503
  • 14
  • 230
  • 353