如何处理场景努比。哪里条件不满意?

2024-04-18 05:16:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在转换此数组:

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

收件人:[2, 0, 1, 0, 0]。你知道吗

基本上,我想返回每个子数组中第一个1的索引。然而,我的问题是我不知道如何处理没有1的场景。如果找不到1,我希望它返回0(如我的示例中所示)。你知道吗

下面的代码运行良好,但对于我提到的场景抛出IndexError: index 0 is out of bounds for axis 0 with size 0

np.array([np.where(r == 1)[0][0] for r in x])

处理这个问题的简单方法是什么?它不需要局限于努比。哪里. 你知道吗

顺便说一下,我正在使用python3。你知道吗


Tags: of示例forindexisnp场景数组
2条回答

对代码的一个简单修改就是在列表中添加一个条件:

np.array([np.where(r == 1)[0][0] if 1 in r else 0 for r in x])
# 23.1 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

获得相同结果的更简洁、更快速的方法是:

np.argmax(x == 1, axis=1)
# 4.04 µs ± 45.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

或者,相当于:

np.argmin(x != 1, axis=1)
# 4.03 µs ± 13.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

使用1smask,然后沿着每一行argmax获取第一个匹配索引以及any来检查有效行(至少有一个1的行)-

mask = x==1
idx = np.where(mask.any(1), mask.argmax(1),0)

现在,所有False上的argmax将返回0。所以,这就直接影响到了问题的解决。因此,我们可以简单地使用mask.argmax(1)结果。但是在一般情况下,如果无效的说明符,我们称之为invalid_val不是0,我们可以在np.where内指定它,就像这样-

idx = np.where(mask.any(1), mask.argmax(1),invalid_val)

另一种方法是获取掩码上的第一个匹配索引,然后索引到掩码中,查看是否有任何索引值是False,并将它们设置为0s-

idx = mask.argmax(1)
idx[~mask[np.arange(len(idx)), idx]] = 0 # or invalid_val

相关问题 更多 >