获取索引并创建基于Python的numpy数组

时间:2015-06-25 16:59:31

标签: python arrays matlab numpy indexing

我将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()将数组转换为矢量,比较索引,将它们收集到另一个变量中并返回。

你能否对此有所了解?

2 个答案:

答案 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]