34

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]
smci
  • 32,567
  • 20
  • 113
  • 146
sarbjit
  • 3,786
  • 9
  • 38
  • 60

4 Answers4

36

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.

Sven Marnach
  • 574,206
  • 118
  • 941
  • 841
  • 5
    `matrix` doesn't behave exactly like `array`. It creates confusion. It might be better to cut the cord and start with `array`. – jfs Aug 09 '12 at 15:04
  • 1
    @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. – Sven Marnach Aug 09 '12 at 15:39
  • 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? – user2428107 Oct 08 '15 at 06:29
34

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]])
jfs
  • 399,953
  • 195
  • 994
  • 1,670
  • 1
    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. – Sven Marnach Aug 09 '12 at 14:39
  • To generalize for higher dimensions, using the idea of @SvenMarnach you can do `a[..., None]`. http://docs.scipy.org/doc/numpy-1.10.1/user/basics.indexing.html#structural-indexing-tools – astrojuanlu Dec 21 '15 at 06:48
  • What is the purpose of the line `np.newaxis is None`? – stackoverflowuser2010 Jun 18 '16 at 21:42
  • @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). – jfs Jun 18 '16 at 22:14
9

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"

Marc Shivers
  • 688
  • 1
  • 4
  • 7
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).

vonPetrushev
  • 5,457
  • 6
  • 39
  • 51