python - 获取与其他约束相结合的行中最小值的索引
问题描述
我需要在 2-dim 数组中找到每行最小值的索引,同时满足对列值的附加约束。有两个数组a
和b
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
之外的其他值。0
1
解决方案
更新为试图更好地理解问题,请尝试:
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 次循环)
推荐阅读
- ios - Swift 自定义 URL 未从扩展程序打开应用程序
- javascript - Vue 中未调用计算属性集
- gitlab-ci - Gitlab-CI:条件变量?
- r - 无法使用 R 中的循环和函数更新向量
- c++ - 在运行时将带有类实例的列表从 c++ 导入到 qml 的建议
- javascript - 无法将行高自动调整为图像
- python - 安装 Python 熊猫
- php - 使用 Ratchet PHP 在 websocket 服务器中处理过期的 Let's Encyrpt SSL
- gcloud - 使用 `gcloud` 解析 IAM 成员(`type:email`)?
- amazon-web-services - Boto3 中的 AWS 转录