首页 > 解决方案 > 获取与其他约束相结合的行中最小值的索引

问题描述

我需要在 2-dim 数组中找到每行最小值的索引,同时满足对列值的附加约束。有两个数组ab

a = np.array([[1,0,1],[0,0,1],[0,0,0],[1,1,1]])

b = np.array([[1,-1,2],[4,-1,1],[1,-1,2],[1,2,-1]])

目标是找到保持a == 1,b为正且b为行的最小值的指标。满足前两个条件很容易

idx = np.where(np.logical_and(a == 1, b > 0))

这产生了指数:

(array([0, 0, 1, 3, 3]), array([0, 2, 2, 0, 1]))

现在我需要过滤重复的行条目(仅坚持最小值),但我想不出一种优雅的方式来实现这一点。在上面的例子中,结果应该是

(array([0,1,3]), array([0,2,0]))

编辑

它也应该适用于包含除anda之外的其他值。01

标签: pythonnumpy

解决方案


更新为试图更好地理解问题,请尝试:

c = b*(b*a > 0)
np.where(c==np.min(c[np.nonzero(c)]))

输出:

(array([0, 1, 3], dtype=int64), array([0, 2, 0], dtype=int64))

时间:

方法一

a = np.array([[1,0,1],[0,0,1],[0,0,0],[1,1,1]])
b = np.array([[1,-1,2],[4,-1,1],[1,-1,2],[1,2,-1]])
b[b<0] = 100000
cond = [[True if i == b.argmin(axis=1)[k] else False for i in range(b.shape[1])] for k in range(b.shape[0])]
idx = np.where(np.logical_and(np.logical_and(a == 1, b > 0),cond))
idx

方法二

c = b*(b*a > 0)
idx1 = np.where(c==np.min(c[np.nonzero(c)]))
idx1

方法一时间:

每个循环 28.3 µs ± 418 ns(平均值 ± 标准偏差。7 次运行,每次 10000 次循环)

方法二计时:

每个循环 12.2 µs ± 144 ns(平均值 ± 标准偏差。7 次运行,每次 100000 次循环)


推荐阅读