2015-01-08 8 views
2

Ниже приведен пример кода MATLAB и его кода eqv Python с использованием пакета Numpy. Код MATLAB работает отлично, но код Python дает вопросы:Преобразование кода Matlab в Python: Матрицы не выровнены

MATLAB/октава

N=1200 
YDFA_P0 = double([1;2;3;4;5]) 
P0=YDFA_P0 *ones(1, N) 


octave:27> whos P0 
Variables in the current scope: 

    Attr Name  Size      Bytes Class 
    ==== ====  ====      ===== ===== 
     P0   5x1200     48000 double 

Total is 6000 elements using 48000 bytes 

Python

import numpy as np 
import scipy 
N=1200 
YDFA_P0 = np.array([1,2,3,4,5]) 
P0 = np.dot(YDFA_P0, np.ones((1, N))) 
P0 = YDFA_P0 * np.ones((1, N)) 

Я получаю ошибку ниже:

Traceback (most recent call last): 
    File "a.py", line 5, in <module> 
    P0 = np.dot(YDFA_P0, np.ones((1, N))) 
ValueError: matrices are not aligned 

Как может Я исправляю эту ошибку или скорее переношу код Matlab на Python?

ответ

2

С np.array([1,2,3,4,5]), вы создаете матрицу с одной строкой (на самом деле, это всего лишь один-мерный вектор), в то время как double([1;2;3;4;5]) матрица с одной колонки. Попробуйте это:

In [14]: YDFA_P0 = np.array([[1],[2],[3],[4],[5]]) 
In [15]: np.dot(YDFA_P0, np.ones((1,5))) 
Out[15]: 
array([[ 1., 1., 1., 1., 1.], 
     [ 2., 2., 2., 2., 2.], 
     [ 3., 3., 3., 3., 3.], 
     [ 4., 4., 4., 4., 4.], 
     [ 5., 5., 5., 5., 5.]]) 

В качестве альтернативы, вы можете также сделать np.array([[1,2,3,4,5]]).transpose() (обратите внимание на [[ ]])

+0

Спасибо за исправление и решение – Prakash

2

Я думаю, что вы ищете outer product:

>>> P0 = np.outer(YDFA_P0, np.ones(N)) 
>>> P0.shape 
(5, 1200) 
+0

Наружное произведение с использованием '' 'numpy.einsum''':' '' np.einsum ('i, j-> ij', YDFA_P0, np.ones (N)) '' ' – wwii

+0

Да и возможно, 'outer' [немного быстрее] (http://stackoverflow.com/questions/27809511/efficient-outer-product-in-python/27809902#27809902) – elyase

+0

Concur, просто приурочен к этому. – wwii

0

Использование numpy.newaxis для выравнивания первый массив:

import numpy as np 

>>> a = np.array([1,2,3,4,5]) 
>>> b = a[:, np.newaxis] 
>>> print b 
[[1] 
[2] 
[3] 
[4] 
[5]] 
>>> c = np.ones((1,5)) 
>>> print c 
[[ 1. 1. 1. 1. 1.]] 
>>> np.dot(b, c) 
array([[ 1., 1., 1., 1., 1.], 
     [ 2., 2., 2., 2., 2.], 
     [ 3., 3., 3., 3., 3.], 
     [ 4., 4., 4., 4., 4.], 
     [ 5., 5., 5., 5., 5.]]) 
>>> 
Смежные вопросы