将 Matlab 的向量赋值转换为 Python 形式



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

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

我冒昧地猜测,xp长头被用作索引来选择wp项,并且w中的这些项被v中的相应项所取代(不含标量theta)。

在Octave中瞎折腾,这似乎是对它所做的事情的准确描述,但我找不到任何相关的文档。

在任何情况下,用Python重写这些代码的最佳方法是什么?我已经查看了NumPy的"试探性教程",试图找到一种优雅的方法来做到这一点,看起来这可能是我正在寻找的。然而,我在使它看起来漂亮方面遇到了麻烦,特别是在赋值操作符方面。有没有更优雅的或python习惯的方法来完成这个赋值操作?

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

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

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

关于基本行为你是对的。索引矩阵idx的第一列的p长度的子向量被用来从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

并且,等效的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.]]

最新更新