我将Matlab转换为Python代码的问题,特别是涉及矩阵/数组时。
在这里,我有一个名为output
的2D t_ind
数组,我正在计算高于变量{{1}的元素的行主索引vmax
的向量}:
t_ind = np.flatnonzero(output > vmax)
现在我想使用这些索引来创建基于它的矩阵。在MATLAB中,我可以直接这样做:
output(t_ind) = 2*vmax - output(t_ind);
但是在Python中这不起作用。具体来说,我得到一个IndexError
声明我超出了界限。
我试图弄明白,但我能想到的最优雅的解决方案是使用np.hstack()
将数组转换为矢量,比较索引,将它们收集到另一个变量中并返回。
你能否对此有所了解?
答案 0 :(得分:1)
对于1D阵列,使用np.flatnonzero
是正确的。具体而言,等效的numpy
语法为:
output[t_ind] = 2*vmax - output[t_ind]
此外,您可以使用布尔运算符实现相同的功能。 MATLAB也支持这种方式,因此如果你想在两者之间进行转换,布尔(或MATLAB世界中的logical
)是更好的方法:
output[output > vmax] = 2*vmax - output[output > vmax]
对于2D情况,您不使用np.flatnonzero
。请改用np.where
:
t_ind = np.where(output > v_max)
output[t_ind] = 2*vmax - output[t_ind]
t_ind
将返回numpy
个数组的元组,其中第一个元素为您提供行位置,第二个元素为您提供满足放入{的布尔条件的那些值的列位置{1}}。
作为一个小注释,布尔索引的情况仍然适用于您想要的矩阵的任何维度。但是,np.where
会将满足输入条件的那些点的行主索引计算为np.flatnonzero
。您收到错误的原因是您尝试使用行主索引来访问2D数组。虽然Python支持线性索引,但np.flatnonzero
不支持 - 您必须独立访问每个维度才能执行此索引,这就是将numpy
指定为{{1}的输入索引会做的。
答案 1 :(得分:0)
Numpy支持布尔索引和多维索引,所以你不需要跳过所有这些箍,这里有两种方法可以得到你想要的东西:
# The setup
import numpy as np
a = np.random.random((3, 4))
vmax = 1.2
output = np.zeros(a.shape, a.dtype)
# Method one, use a boolean array to index
mask = a > .5
output[mask] = 2 * vmax - a[mask]
# Method tow, use indices to index.
t_ind = np.nonzero(a > .5)
output[t_ind] = 2 * vmax - a[t_ind]