Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Numpy.dot() dimensions not aligned

I'm having trouble giving the right input to the scipy.signal.dlsim method.

The method requires the 4 state space matrices:

A = np.array([
    [0.9056, -0.1908, 0.0348, 0.0880],
    [0.0973, 0.8728, 0.4091, -0.0027],
    [0.0068, -0.1694, 0.9729, -0.6131],
    [-0.0264, 0.0014, 0.1094, 0.6551]
    ])

B = np.array([
    [0, -0.0003, -0.0330, -0.0042, -0.0037],
    [0, -0.0005, 0.0513, -0.0869, -0.1812],
    [0, 0.0003, -0.0732, 1.1768, -1.1799],
    [0, -0.0002, -0.0008, 0.2821, -0.4797]
    ])

C = np.array([-0.01394, -0.0941, 0.0564, 0.0435])

D = np.array([0, 0.0004, -0.0055, 0.3326, 0.5383])

and an input vector which I build in the following way:

inputs = np.array([
    data['input1'].values(),
    data['input2'].values(),
    data['input3'].values(),
    data['input4'].values(),
    data['input5'].values()
])

This creates an inputs matrix with (5x752) dimensions (I have 752 data points). So I take the transpose of the inputs matrix to preprocess my data:

inputs = np.transpose(inputs)

The inputs matrix now has the (752x5) dimensions I presume are necessary for the simulation algorithm of scipy.

When I execute the method, I get the following error:

    110     # Simulate the system
    111     for i in range(0, out_samples - 1):
--> 112         xout[i+1,:] = np.dot(a, xout[i,:]) + np.dot(b, u_dt[i,:])
    113         yout[i,:] = np.dot(c, xout[i,:]) + np.dot(d, u_dt[i,:])
    114 

ValueError: shapes (4,5) and (1,5) not aligned: 5 (dim 1) != 1 (dim 0)

I understand scipy is unable to make this multiplication but I do not know in which format I should give my inputs array to the method. If I would not transpose the matrix the dimensions would be even worse (1x752).

Am I missing something here?

like image 438
arnoutaertgeerts Avatar asked Jan 19 '15 16:01

arnoutaertgeerts


People also ask

How does dot work in Numpy?

This function returns the dot product of two arrays. For 2-D vectors, it is the equivalent to matrix multiplication. For 1-D arrays, it is the inner product of the vectors. For N-dimensional arrays, it is a sum product over the last axis of a and the second-last axis of b.

How do dimensions work in Numpy?

In Mathematics/Physics, dimension or dimensionality is informally defined as the minimum number of coordinates needed to specify any point within a space. But in Numpy, according to the numpy doc, it's the same as axis/axes: In Numpy dimensions are called axes. The number of axes is rank.

What is the difference between Matmul and dot in Numpy?

The matmul() function broadcasts the array like a stack of matrices as elements residing in the last two indexes, respectively. The numpy. dot() function, on the other hand, performs multiplication as the sum of products over the last axis of the first array and the second-to-last of the second.

Why is Numpy dot faster than for loop?

Because np. dot executes the actual arithmetic operations and the enclosing loop in compiled code, which is much faster than the Python interpreter.


1 Answers

The numpy.dot() method works separately for a matrix and an array. I converted the array somewhere to a matrix to be able to easily read the dimensions which caused this error. If the vector is interpreted as a matrix, it is seen by Numpy as a row vector. This gives the dimensions error: (4x5) x (1x5).

When numpy sees the vector as an array, numpy.dot() automatically does the right multiplication because the vector is seen as a column vector and the np.dot() can be calculated correctly: (4x5) x (5x1)

like image 118
arnoutaertgeerts Avatar answered Oct 08 '22 17:10

arnoutaertgeerts