2013-05-06 77 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.]]