Numpy transpose of 1D array not giving expected result
Asked Answered
D

5

37

I am trying a very basic example in Python scipy module for transpose() method but it's not giving expected result. I am using Ipython with pylab mode.

a = array([1,2,3]
print a.shape
>> (3,)

b = a.transpose()
print b.shape
>> (3,)

If I print the contents of arrays "a" and "b", they are similar.

Expectation is: (which will be result in Matlab on transpose)

 [1,
  2,
  3]
Derogate answered 9/8, 2012 at 14:19 Comment(1)
Similar: https://mcmap.net/q/107651/-transposing-a-1d-numpy-arrayWall
S
37

NumPy's transpose() effectively reverses the shape of an array. If the array is one-dimensional, this means it has no effect.

In NumPy, the arrays

array([1, 2, 3])

and

array([1,
       2,
       3])

are actually the same – they only differ in whitespace. What you probably want are the corresponding two-dimensional arrays, for which transpose() would work fine. Also consider using NumPy's matrix type:

In [1]: numpy.matrix([1, 2, 3])
Out[1]: matrix([[1, 2, 3]])

In [2]: numpy.matrix([1, 2, 3]).T
Out[2]: 
matrix([[1],
        [2],
        [3]])

Note that for most applications, the plain one-dimensional array would work fine as both a row or column vector, but when coming from Matlab, you might prefer using numpy.matrix.

Social answered 9/8, 2012 at 14:23 Comment(3)
matrix doesn't behave exactly like array. It creates confusion. It might be better to cut the cord and start with array.Mezzanine
@J.F.Sebastian: The fact that it behaves differently is exactly the reason I mentioned it, since this behaviour is closer to what Matlab users are used to. I rarely use the matrix class, but I find it handy sometimes.Social
Recently I had to use a function (from sklearn) which calls .shape on its input to decide the number of features and samples. So for my data, it explicitly required an input array of shape (5,1) rather than (1,5), in order to do what I wanted. In this case a matrix will work and an array won't - unless there is a way to handle this with arrays?Phrensy
M
35

Transpose is a noop for one-dimensional arrays.

Add new axis and transpose:

>>> a[None].T
array([[1],
       [2],
       [3]])
>>> np.newaxis is None
True

Or reshape:

>>> a.reshape(a.shape+(1,))
array([[1],
       [2],
       [3]])

Or as @Sven Marnach suggested in comments, add new axis at the end:

>>> a[:,None]
array([[1],
       [2],
       [3]])
Mezzanine answered 9/8, 2012 at 14:31 Comment(4)
Instead of adding an axis at the beginning and transposing, I'd usually prefer to add the new axis at the end: a[:,None] will give the desired result in a single step.Social
To generalize for higher dimensions, using the idea of @SvenMarnach you can do a[..., None]. docs.scipy.org/doc/numpy-1.10.1/user/…Ger
What is the purpose of the line np.newaxis is None?Precedent
@stackoverflowuser2010: to confirm that None is another name for np.newaxis in this case (I prefer None but somebody else may think that np.newaxis is better in this case).Mezzanine
K
10

A more concise way to reshape a 1D array into a 2D array is:

a = np.array([1,2,3]),  a_2d = a.reshape((1,-1)) or a_2d = a.reshape((-1,1))

The -1 in the shape vector means "fill in whatever number makes this work"

Kath answered 9/8, 2012 at 14:44 Comment(0)
P
7

You should try: a = array([[1,2,3]]) or a = array([[1],[2],[3]]) , that is, a should be a matrix (row vector, column vector).

Plasterboard answered 9/8, 2012 at 14:23 Comment(0)
S
0

Try enclosing them in another bracket. It's no longer strictly "1D" as Numpy now considers that the 1st row of an editable array (sort of).

import numpy

a = numpy.array([[1, 2, 3]])
print(numpy.transpose(a))
>> [[1]
 [2]
 [3]]
Steinway answered 20/9, 2023 at 12:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.