如何在numpy中的条件下将值替换为其列或行索引



如果值>=,如何用列索引替换n x n数组中的每个值1,否则使用行索引。如果替换后的值映射到其他1d数组并从中返回值,那就更好了。

value_array = np.array([200, 200, 300, 10])
arr = np.array(
[[1, 1, .66, 20],
[1, 1, .66, 20],
[1.5, 1.5, 1, 30],
[.05, .05, .03, 1]]
)

目标是获得一个大小相同的数组,其中包含value_array中的值。示例:

  • 在位置[0,2]处,值为.66,小于1,因此需要行索引,该索引为0。0被索引到value_array中,并且结果矩阵位置[0,2]中的答案是200
  • 在位置[0,3]处,值为20,其大于1,因此需要列索引,其为3。3被索引到value_array中,并且结果矩阵位置[0,3]中的答案是10

此外,要应用于大阵列(1m x 1m(执行,需要以某种方式将其拆分为多个部分。

单向使用numpy.select:

conds = [arr>1, arr<1]
target = np.full(arr.shape, value_array)
np.select(conds, [target, target.T], arr)

输出:

array([[  1.,   1., 200.,  10.],
[  1.,   1., 200.,  10.],
[200., 200.,   1.,  10.],
[ 10.,  10.,  10.,   1.]])

使用np.where:的另一个选项

# I've rename value_array to v for simplicity.
# We use the broadcasting potential of numpy to get our result
res = np.where(arr>=1,v,v.reshape(len(v),1))

res=

array([[200, 200, 200,  10],
[200, 200, 200,  10],
[200, 200, 300,  10],
[ 10,  10,  10,  10]])

这个解决方案也使用较少的内存,因为您不需要存储中间结果。

最新更新