如何在numpy中使用条件替换其列或行索引的值?

问题描述

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

value_array = np.array([200,200,300,10])

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

目标是从value_array获得包含大小的相同大小的数组。 例子:

  • 在位置[0,2]上的值是.66,该值小于1,因此需要行索引为0。然后将0索引到value_array中,结果矩阵position [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.,[200.,[ 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,10],[200,300,[ 10,10,10]])

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