How can we make a series a column vector (or a row vector)?

Hi,

I have a Pandas series which I would like to use it as a column vector (row vector) so that I can do matrix multiplication (by “@”). Is there any way to do this? Thanks!!


b1
A        16.296177
U     502.380879
R      30.473558
C       -158.452957
F        121.714080
T        725.545754
P        809.887519
M        591.190956
R      -54.401249
H   -966.642968
dtype: float64
b1
type(b1)
pandas.core.series.Series

pandas Series provide a to_numpy() method which will give you a standard numpy array. You can always make it to/from a column/row with .T.

Thanks Matt. It seems that by default, it becomes a column vector

b1.to_numpy().shape
(10,)

To my understanding, Numpy doesn’t really have a solid definition of “row” and “column”. At best you can look at how they are printed by default, where an array like a = np.array([4, 5, 6]) with shape: (3,) will print as:

[4 5 6]

so I guess you could consider it a “row vector”. What matters for things like @ is the relative shape of the two objects.

If you want two objects to be distinct in shape, the common way it to make two matrices, one that is 1×10 and one that is 10×1. To turn an array, a, of shape (10,) into one of (10,1) you can do a[:, np.newaxis] (or to turn it into (1, 10) you can do a[np.newaxis, :]).

As it happens, you can use some of the automatic features of the @ operator, which for numpy is defined at numpy.matmul. One of the key points there are under the “Notes” where it says:

  • If the first argument is 1-D, it is promoted to a matrix by prepending a 1 to its dimensions. After matrix multiplication the prepended 1 is removed.
  • If the second argument is 1-D, it is promoted to a matrix by appending a 1 to its dimensions. After matrix multiplication the appended 1 is removed.

and so you perhaps don’t need to actually do any shape conversions in the case where you, for example, have two vectors you want to @ together.

Furthermore, I checked and pandas Series can be @ directly, without having to convert them to numpy, so you can do:

>>> a = np.array([4, 5, 6])
>>> s = pd.Series([1, 2, 3])
>>> a @ s
32
1 Like