Bananach - 2 months ago 10

Python Question

Consider the following code:

`>>x=np.array([1,3]).reshape(2,1)`

array([[1],

[3]])

>>M=np.array([[1,2],[3,4]])

array([[1, 2],

[3, 4]])

>>y=M[:,0]

>>x-y

array([[ 0, 2],

[-2, 0]])

I would intuitively feel this should give a (2,1) vector of zeros.

I am not saying, however, that this is how it should be done and everything else is stupid. I would simply love if someone could offer some logic that I can remember so things like this don't keep producing bugs in my code.

Note that I am not asking how I can achieve what I want (I could reshape y), but I am hoping to get some deeper understanding of why Python/Numpy works as it does. Maybe I am doing something conceptually wrong?

Answer

`numpy.array`

indexes such that a single value in any position collapses that dimension, while slicing retains it, even if the slice is only one element wide. This is completely consistent, for any number of dimensions:

```
>> A = numpy.arange(27).reshape(3, 3, 3)
>> A[0, 0, 0].shape
()
>> A[:, 0, 0].shape
(3,)
>> A[:, :, 0].shape
(3, 3)
>> A[:1, :1, :1].shape
(1, 1, 1)
```

Notice that every time a single number is used, that dimension is dropped.

You can obtain the semantics you expect by using `numpy.matrix`

, where two single indexes return a order 0 array and all other types of indexing return matrices

```
>> M = numpy.asmatrix(numpy.arange(9).reshape(3, 3))
>> M[0, 0].shape
()
>> M[:, 0].shape # This is different from the array
(3, 1)
>> M[:1, :1].shape
(1, 1)
```

Your example works as you expect when you use `numpy.matrix`

:

```
>> x = numpy.matrix([[1],[3]])
>> M = numpy.matrix([[1,2],[3,4]])
>> y = M[:, 0]
>> x - y
matrix([[0],
[0]])
```