Python:满足条件时在2D数组中查找值的行索引

时间:2020-09-02 11:12:53

标签: arrays numpy numpy-ndarray

我有一个尺寸为8500 x 5的2D数组PointAndTangent。该数据按行排列,具有8500个数据行,每行5个数据值。满足此条件时,对于任何s,我需要提取第4列中元素的行索引:

abs(PointAndTangent[:,3] - s) <= 0.005

对于上述情况,我只需要第一个匹配项的行索引。我尝试使用以下内容:

index = np.all([[abs(s - PointAndTangent[:, 3])<= 0.005], [abs(s - PointAndTangent[:, 3]) <= 0.005]], axis=0)

i = int(np.where(np.squeeze(index))[0])

这不起作用。我收到以下错误:

i = int(np.where(np.squeeze(index))[0])

TypeError: only size-1 arrays can be converted to Python scalars

我对Python的NumPy不太熟练。任何建议都很好。我试图避免使用for循环,因为这只是我正在尝试的大型仿真的一小部分。

谢谢!

可能的解决方案 我使用了以下

idx = (np.abs(PointAndTangent[:,3] - s)).argmin()

似乎可行。它将最接近值的行索引返回到第四列中的s

1 个答案:

答案 0 :(得分:0)

您快到了。 np.where是numpy中使用最广泛的函数之一。一半时间,您确实想要np.nonzero,另一半,您想直接使用布尔掩码。在您的情况下,您需要np.flatnonzeronp.argmax

mask = abs(PointAndTangent[:,3] - s) <= 0.005

mask是一维数组,其中一个满足条件,而另一个为零。您可以使用flatnonzero获取所有索引,然后选择第一个索引:

index = np.flatnonzero(mask)[0]

或者,您也可以直接使用argmax选择第一个:

index = np.argmax(mask)

在没有满足您条件的行的情况下,解决方案的行为会有所不同。三个前者会做索引,因此会引发错误。后者将返回零,这也可能是真实结果。

通过将mask替换为分配给它的表达式,可以将两者都写成单行。

相关问题