满足条件时查找每行的最大值

时间:2020-03-09 10:03:42

标签: python numpy

我遇到以下相对简单的问题。我有两个数组,每个时间步分别存储xy坐标,例如

x = [[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]]
y = [[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]]

,其中表示2个时间步长(2行)。我想要的是在满足条件y时找到每行的最大x >= 1 and x <= 2.5坐标。

当满足空间x条件时,如何定义一个返回两列的数组,每行仅max(y)的函数?

我尝试np.where时不走运。函数应返回的结果是:

[0.5, 0.52]

3 个答案:

答案 0 :(得分:0)

不太漂亮,但是使用纯Python(无oCRS = New (oServer.CRSName) ),您可以结合使用numpyzipfilter

max

或者更短一些,使用列表推导来过滤和反转元组的顺序,以便>>> x = [[0,1,2,3],[0.1,1.1,2.1,3.1]] >>> y = [[0.5,0.5,0.5,0.5],[0.51,0.52,0.49,0.53]] >>> [max(filter(lambda t: 1.0 <= t[0] <= 2.5, zip(rx, ry)), key=lambda t: t[1])[1] ... for rx, ry in zip(x, y)] ... [0.5, 0.52] 可以使用自然顺序:

max

答案 1 :(得分:0)

正如您所建议的Numpy解决方案:

import numpy as np

x = np.array([[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]])
y = np.array([[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]])

print([np.max(y[i][(x[i] >= 1) & (x[i] <= 2.5)]) for i in range(len(x))])

给予

[0.5, 0.52]

答案 2 :(得分:0)

您可以使用numpy的遮罩功能。遮罩函数“遮罩”真实值,因此条件被翻转。

import numpy as np

x = [[0, 1, 2, 3], [0.1, 1.1, 2.1, 3.1]]
y = [[0.5, 0.5, 0.5, 0.5], [0.51, 0.52, 0.49, 0.53]]

x = np.array(x)
y = np.array(y)

y_masked = np.ma.masked_where((x>2.5) | (x<1), y)
result = np.max(y_masked, axis = 1)

print(result)