我正在尝试将一些Matlab代码翻译成Python(使用NumPy)。我对Matlab不是很熟悉,而且我遇到了一条解析时遇到问题的行:
w(idx(1:p, 1), 1) = v(idx(1:p, 1), 1) - theta;
我猜测p
长x
的头部被用作选择p
的{{1}}条目的索引,以及那些条目w
中的相应条目替换了w
(较少的标量为v
)。
在Octave中徘徊,这似乎是对它正在做什么的准确描述,但我找不到任何相关的文档。
无论如何,在Python中重写这段代码的最佳方法是什么?我看过NumPy的“暂定教程”试图找到一种优雅的方法,看起来this可能就是我正在寻找的东西。但是,我很难让它看起来不错,特别是对于赋值运算符。是否有更优雅或Python惯用的方法来执行此分配操作?
答案 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
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