将Matlab的向量分配转换为Python形式

时间:2013-05-06 12:09:06

标签: python matlab numpy code-translation

我正在尝试将一些Matlab代码翻译成Python(使用NumPy)。我对Matlab不是很熟悉,而且我遇到了一条解析时遇到问题的行:

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

我猜测px的头部被用作选择p的{​​{1}}条目的索引,以及那些条目w中的相应条目替换了w(较少的标量为v)。

在Octave中徘徊,这似乎是对它正在做什么的准确描述,但我找不到任何相关的文档。

无论如何,在Python中重写这段代码的最佳方法是什么?我看过NumPy的“暂定教程”试图找到一种优雅的方法,看起来this可能就是我正在寻找的东西。但是,我很难让它看起来不错,特别是对于赋值运算符。是否有更优雅或Python惯用的方法来执行此分配操作?

2 个答案:

答案 0 :(得分:1)

这基本上是@Dan在评论中写的内容,但在python中考虑了从零开始的索引:

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

不确定你是否想要比这更优雅的东西。如果只修改第一列,则需要这些零。

答案 1 :(得分:0)

你对基本行为是正确的。来自索引矩阵p的第一列的idx - 长度子矢量用于从v中选择元素并将它们放入矩阵{{1}中的相同位置首先用标量w调整它们的值。

对于theta使用基于一的索引进行MATLAB和基于零的索引至关重要。

在MATLAB中,

numpy

产生输出

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