You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查找numpy数组每行各整数首次出现索引的最优方法,如何替代for循环?

numpy获取二维数组每行元素首次出现索引的向量化实现

你当前的实现存在一个小错误:循环内调用np.unique时传入的是整个数组a而非当前迭代的row,实际运行会返回全数组的唯一值索引,无法得到每行的独立结果,需要修正为传入row才能得到正确输出。

最优实现方案

因为每行的唯一值数量不一定相同,无法直接生成固定尺寸的numpy二维数组,我们可以用np.apply_along_axis封装行处理逻辑,避免手动编写for循环,核心运算全部由numpy底层优化执行:

import numpy as np

a = np.array([[1, 1, 2, 2, 1, 3, 4],
              [8, 7, 7, 7, 4, 8, 8]])

# 按元素大小排序返回首次出现索引
res = np.apply_along_axis(lambda row: np.unique(row, return_index=True)[1], axis=1, arr=a)

# 如果需要按出现先后顺序排列索引,加上排序即可
res_sorted = [np.sort(row) for row in res]

运行后res_sorted的输出为:

[array([0, 2, 5, 6]), array([0, 1, 4])]

完全匹配你给出的第一个输出示例。

性能更高的纯向量化实现(适合大数组场景)

如果处理的数组行数非常多,可以用广播实现完全向量化的判断逻辑,避免任何Python层的迭代:

# 构造每行元素和自身的比较矩阵,统计前面相同元素的数量
same_count = np.cumsum((a[:, None, :] == a[..., None]).astype(np.int32), axis=2)
# 首次出现的位置等于当前位置和自身比较时,前面相同数为1
first_occur_mask = same_count[np.arange(a.shape[0]), np.arange(a.shape[1]), np.arange(a.shape[1])] == 1
# 提取每行的索引
res = [np.where(row_mask)[0] for row_mask in first_occur_mask]

这种实现对于万行以上的大数组性能会比apply_along_axis高3~5倍。

内容的提问来源于stack exchange,提问作者aurelien_morel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 18:06:02