2017-02-06 6 views
1

У меня есть следующая матрица m.Выполнение операции питания на матрице в Python

m = 

0  0  0  0 
0  1  2  3 
0  2  4  6 
0  3  6  9 

Я пытаюсь выполнить эквивалентную операцию MATLAB с использованием Python.

new_m = w.^m 

т.е. преобразование т в follwing матрицы:

new_m = 

1  1  1  1 
1  w^1 w^2 w^3 
1  w^2 w^4 w^6 
1  w^3 w^6 w^9 

В настоящее время мой Python подход заключается в следующем:

N=4 
    w=cmath.exp(2*pi) # Here w = 535.491655525+0j 
    row=list(range(N)) # In this case row = [0, 1, 2, 3] 

    #Create the matrix and perform operation on it 
    m = [[0]*N for i in range(N)] 
    for x in range(1,q): 
     for entry in row: 
      m[x][entry]=entry*r      # <--- This gives me give me the above matrix m 

    # This was my attempt to perform the new_m=w.^m operation 
    for x in range(0,q): 
     for entry in row: 
      element=M[x][entry] 
      new_m[x][entry]=w**element    # <--- This should give me the correct new_m matrix described above 

Мой код Python дает мне следующий результат:

[ [ 1.0000e+00+0.j 1.0000e+00+0.j 1.0000e+00+0.j 1.0000e+00+0.j] 
    [ 1.0000e+00+0.j 5.3549e+02+0.j 2.8675e+05+0.j 1.5355e+08+0.j] 
    [ 1.0000e+00+0.j 2.8675e+05+0.j 8.2226e+10+0.j 2.3579e+16+0.j] 
    [ 1.0000e+00+0.j 1.5355e+08+0.j 2.3579e+16+0.j 3.6205e+24+0.j]] 

Но i е я выполнить эту операцию в MATLAB он дает мне этот ответ на new_m = w.^m операции:

new_m = 

    1.0e+24 * 

    0.0000 0.0000 0.0000 0.0000 
    0.0000 0.0000 0.0000 0.0000 
    0.0000 0.0000 0.0000 0.0000 
    0.0000 0.0000 0.0000 3.6205 

Я не уверен, почему эти ответы отличаются и где я Wong в том, что я предполагаю, что это ошибка в моем питона код , Любые советы или предложения были бы оценены!

Примечание: Я также попытался с помощью следующей команды после моего первого набора для петель (с использованием м матрицы):

new_m = w**m 

Но это произвело ошибку:

TypeError: unsupported operand type(s) for ** or pow(): 'complex' and 'list' 
+0

Во-первых - если вы выполняете работу atrix на Python, для чего-либо, кроме понимания того, как работает langauge, вы должны использовать Numpy http://www.numpy.org/. Поддержка операций такого рода выходит за пределы box с массивами Numpy - и это будет примерно в 10000 раз быстрее, чем та же самая операция, выполняемая с помощью внешних Python для циклов. – jsbueno

ответ

3

Сначала: ваш код на Python и вывод правильны - если вы проверяете вывод, происходит то, что Matlab просто представляет значения, в которых другие числа матрицы печатаются с округлением до «0», поскольку он использует единый показатель (e + 24) для всех членов матрицы.

Выход Python, с другой стороны, правильно печатает каждое число с собственной собственной величиной. Итак, «2.3579e + 16 + 0.j» - это число 10 ** в 8 раз меньше, чем «3.6205e + 24 + 0.j]», а так как Matlab использует показатель e + 24 для всего, он просто печатает 0. Внутри он сохраняет правильные значения.

Второй: Вы должны использовать Numpy (http://numpy.org) - среди нескольких других функций он предлагает математическую арифметику из коробки.

Для вас силовой операции, например: :

In [1]: import numpy as np 

In [2]: z = np.array(range(9)) 

In [3]: z 
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 

In [4]: z.shape = (3,3) 

In [5]: z 
Out[5]: 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 

In [10]: w = cmath.exp(2*cmath.pi) 

In [11]: w 
Out[11]: (535.4916555247646+0j) 

In [12]: w ** z 
Out[12]: 
array([[ 1.00000000e+00+0.j, 5.35491656e+02+0.j, 2.86751313e+05+0.j], 
     [ 1.53552935e+08+0.j, 8.22263156e+10+0.j, 4.40315059e+13+0.j], 
     [ 2.35785040e+16+0.j, 1.26260921e+19+0.j, 6.76116697e+21+0.j]]) 

(In[1]: стиль подсказок вместо >>> обусловлена ​​ipython - расширенной Python интерактивной оболочки, которая очень полезна)

Кроме того, , выполняя этот вид o Матричные операции с использованием внешних циклов Python для циклов могут быть от 1000 до 10000 раз медленнее - поэтому правильное использование Numpy связано с тем, что они знакомы с Python и знакомы с образом работы Numpy, что способствует работе матрицы ns вычисляется в собственном коде.

+0

Спасибо, что объяснили, так как я очень смутился! Я слышал о numpy, но, поскольку я пытался правильно достичь определенного формата матрицы m, используя numpy, я вместо этого использовал петли python. Тем не менее, я снова загляну к вам и благодарю вас за объяснение! – Catherine

+0

Обратите внимание, что ваш код для заполнения начальных значений в вашей матрице 'm' является правильным и будет необходим после создания матрицы numpy. – jsbueno

+0

Спасибо, я изменил m и new_m на 'm = np.zeros ((N, N))' и 'new_m = np.zeros ((N, N))' и сохранил то же самое для циклов, чтобы заполнить матрицы. Однако теперь я получаю ошибку 'TypeError: невозможно преобразовать комплекс в float', относящийся к строке' new_m [x] [entry] = w ** element '. У вас есть идея, почему это может происходить с использованием np вместо того, как я имел это в своем первоначальном вопросе? – Catherine

Смежные вопросы