2013-05-06 84 views
2

我正在嘗試將一些Matlab代碼轉換爲Python(使用NumPy)。我不是很熟悉MATLAB,和我遇到我無法解析的一行:將Matlab的向量分配轉換爲Python形式

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

我會大膽地猜測的x一個p - 長頭被用作指標以選擇wp條目,並且w中的那些條目正被v(少一個標量theta)中的相應條目替換。

在Octave裏亂竄,這看起來像是它正在做什麼的準確描述,但我找不到任何文檔來達到這個效果。

無論如何,在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 2013-05-06 12:19:32

+1

不要忘記基於零和基於一個索引 – Amro 2013-05-06 12:53:17

回答

1

這基本上就是在@丹的評論中寫道,但是在Python中佔從零開始的索引:

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

不知道,如果你想的東西比這更優雅。如果只修改第一列,則需要這些零。

+1

你一定會喜歡python:p! – Shai 2013-05-06 16:19:18

0

你是對的基本行爲。來自索引矩陣idx的第一列的長度子向量用於從v中選擇元素,並且在首先通過標量theta調整它們的值之後將它們放置在矩陣w中的相同位置中。

使用基於一個索引的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 

而且,使用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 

其中產生輸出的等效Python代碼

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.]]