【问题标题】:Translate Matlab's vector assignment into Python form将 Matlab 的向量赋值转换为 Python 形式
【发布时间】:2013-04-30 04:35:39
【问题描述】:

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

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

我冒险猜测xp-long 头被用作索引来选择wp 条目,并且w 中的那些条目正在被相应的替换v 中的条目(少一个标量 theta)。

在 Octave 中乱七八糟,这似乎是对它在做什么的准确描述,但我找不到任何文档。

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

【问题讨论】:

  • 你说的听起来很对。这可能会对您的翻译有所帮助:scipy.org/NumPy_for_Matlab_Users,但我认为w(idx(1:p, 1), 1) 在 python 中变为w[idx[:p, 1], 1]
  • 不要忘记从零开始与从一开始的索引

标签: python matlab numpy code-translation


【解决方案1】:

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

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

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

【讨论】:

  • 你必须爱上 python :p !
【解决方案2】:

您对基本行为的看法是正确的。来自索引矩阵idx 第一列的p-length 子向量用于从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

并且,使用 numpy 的等效 Python 代码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多