我遇到以下相对简单的问题。我有两个数组,每个时间步分别存储x
和y
坐标,例如
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]
答案 0 :(得分:0)
不太漂亮,但是使用纯Python(无oCRS = New (oServer.CRSName)
),您可以结合使用numpy
,zip
和filter
:
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)