2013-05-06 2 views
2

Я пытаюсь перевести некоторый код Matlab в Python (используя NumPy). Я не очень хорошо знаком с Matlab, и я обнаружил, что линия у меня возникают проблемы синтаксического анализа:Перевести векторное назначение Matlab в форму Python

w(idx(1:p, 1), 1) = v(idx(1:p, 1), 1) - theta; 

я догадку, что p -длинный глава x используется в качестве индексов для выбора p записей w и что те записи в w заменяются соответствующими записями в v (за исключением скаляра theta).

Прослушивание в Октаве, это похоже на точное описание того, что он делает, но я не могу найти документацию на этот счет.

В любом случае, что является лучшим способом переписать этот код в Python? Я посмотрел на предустановленный учебник NumPy, чтобы попытаться найти элегантный способ сделать это, и похоже, что this может быть тем, что я ищу. Тем не менее, у меня проблемы с тем, что он выглядит хорошо, особенно с оператором присваивания. Существуют ли более элегантные или Python-идиоматические способы выполнения этой операции назначения?

+1

Что вы говорите, звучит правильно. Это может помочь вам в переводе: http://www.scipy.org/NumPy_for_Matlab_Users, но я думаю, что w (idx (1: p, 1), 1) 'становится' w [idx [: p, 1] , 1] 'в python – Dan

+1

не забывайте о нулевом сравнении с однонаправленным индексированием – Amro

ответ

1

Это в основном то, что написал @Dan в комментариях, но счета для индексации с нуля в питоне:

w[idx[:p, 0], 0] = v[idx[:p, 0], 0] - theta 

Не уверен, что если вы хотите что-то более изящное, чем это. Эти нули требуются, если нужно изменить только первый столбец.

+1

вам нужно любить python: p! – Shai

0

Вы правы в отношении основного поведения. A p - длина суб-вектора из первого столбца матрицы индексирования idx используется для выбора элементов из v и размещения их в тех же местах в матрице w после первой корректировки их значений скаляром theta.

Крайне важно использовать однонаправленную индексацию для MATLAB и индексацию на основе нуля для numpy.

В MATLAB,

clear 

% Data matrices 
w = zeros(5,5) 
v = diag([10,20,30,40,50]) * ones(5,5) 

% Indexing matrix 
idx = ceil(5*rand(5, 5)) 

% Selection and adjustment parameters 
p = 3  
theta = 1 

% Apply adjustment and selection 
w(idx(1:p, 1), 1) = v(idx(1:p, 1), 1) - theta 

производит выходной сигнал

w = 

    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 
    0  0  0  0  0 


v = 

    10 10 10 10 10 
    20 20 20 20 20 
    30 30 30 30 30 
    40 40 40 40 40 
    50 50 50 50 50 


idx = 

    3  1  2  3  4 
    1  1  2  1  3 
    4  1  2  2  2 
    1  1  5  1  1 
    1  2  4  5  4 


theta = 

    1 


p = 

    3 


w = 

    9  0  0  0  0 
    0  0  0  0  0 
    29  0  0  0  0 
    39  0  0  0  0 
    0  0  0  0  0 

И, эквивалентный код Python с использованием numpy

import numpy as np 

# Data arrays 
w = np.zeros((5,5)) 
v = np.dot(np.diag([10, 20, 30, 40, 50]), np.ones((5,5))) 
print "w = " 
print w 
print "v = " 
print v 

# Indexing array 
idx = np.floor(5 * np.random.rand(5,5)).astype(int) 
print "idx = " 
print idx 

# Selection and adjustment parameters 
theta = 1 
p = 3 

# Apply selection and adjustment 
w[idx[:p, 0], 0] = v[idx[:p, 0], 0] - theta 
print "w = " 
print w 

, которая производит вывод

w = 
[[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.]] 
v = 
[[ 10. 10. 10. 10. 10.] 
[ 20. 20. 20. 20. 20.] 
[ 30. 30. 30. 30. 30.] 
[ 40. 40. 40. 40. 40.] 
[ 50. 50. 50. 50. 50.]] 
idx = 
[[0 2 2 0 3] 
[1 2 1 2 4] 
[2 2 4 3 4] 
[0 1 1 4 4] 
[0 1 0 4 3]] 
w = 
[[ 9. 0. 0. 0. 0.] 
[ 19. 0. 0. 0. 0.] 
[ 29. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0.]]