假设我有一对 numpy 数组 X 和 I 看起来像这样(X 是 2D,I 是 1D)
X I
-----------------
3.4 9.13 0
3.5 3.43 1
3.6 2.01 2
3.7 6.11 0
3.8 4.95 1
3.9 7.02 2
4.0 4.41 3
4.1 0.23 0
4.2 0.99 1
4.3 1.02 0
4.4 5.61 1
4.5 7.55 2
4.6 8.10 0
4.7 0.33 2
4.8 0.80 1
我想做两件事:
Y = indexby(X,I,I0):给定一个值 I0,找到 X 中与 I 中具有匹配值的行。例如,如果 I 是 2,我会想要找到以下数组:3.6 2.01 3.9 7.02 4.5 7.55 4.7 0.33Y = indexby(X,I):返回包含所有可能的键k的字典,这样Y[k] == indexby (X,I,k)。在我的示例数据中,这将产生以下结果:Y[0] = 3.4 9.13 3.7 6.11 4.1 0.23 4.3 1.02 4.6 8.10 Y[1] = 3.5 3.43 3.8 4.95 4.2 0.99 4.4 5.61 4.8 0.80 Y[2] = 3.6 2.01 3.9 7.02 4.5 7.55 4.7 0.33 Y[3] = 4.0 4.41
是否有 numpy 函数可以做到这一点?我不确定要寻找什么,所以很难找到它们。
我知道我可以手动执行此操作,但出于性能原因,我想使用内置的 numpy 函数,因为我的应用程序中的数组的行数通常在 100,000 - 1,000,000 范围内。
请您参考如下方法:
有一些高级函数,但让我们看看如何只使用库中最简单的东西来实现它,因为您每天都需要这些简单的函数。
>>> matches = (I == 2)
>>> matches
array([False, False, True, False, False, True, False, False, False,
False, False, True, False, True, False], dtype=bool)
>>> indices = np.nonzero(matches)
>>> indices
(array([ 2, 5, 11, 13]),)
>>> xvals = X[indices]
>>> xvals
array([[ 3.6 , 2.01],
[ 3.9 , 7.02],
[ 4.5 , 7.55],
[ 4.7 , 0.33]])
最后一步可能看起来令人困惑。参见 Indexing在教程中了解更多信息。
一旦您了解了 == 运算符和 nonzero 的工作原理工作,查看与 nonzero 相同部分中的其他函数,您应该找到两个更短的方法来完成此操作。
