gpt4 book ai didi

python - Numpy:从点列表中获取最大值的正确方法

转载 作者:太空狗 更新时间:2023-10-30 00:58:26 25 4
gpt4 key购买 nike

我有一个 3d 坐标系(X、Y、Z)中的点列表。此外,它们中的每一个都分配了一个浮点值 v,因此单个点可能被描述为 (x, y, z v)。此列表表示为 shape=(N,4) 的 numpy 数组。对于每个 2d 位置 xy 我需要获得 v 的最大值。一种简单但计算量大的方法是:

for index in range(points.shape[0]):
x = points[index, 0]
y = points[index, 1]
v = points[index, 3]

maxes[x, y] = np.max(maxes[x, y], v)

是否有更“numpy”的方法,能够在性能方面带来一些 yield ?

最佳答案

设置

points = np.array([[ 0,  0,  1,  1],
[ 0, 0, 2, 2],
[ 1, 0, 3, 0],
[ 1, 0, 4, 1],
[ 0, 1, 5, 10]])

这里的总体思路是使用第一、第二和第四列进行排序,并将结果反转,这样当我们找到我们的唯一值时,第四列中具有最大值的值将高于其他具有类似值的值x 和 y 坐标。然后我们使用 np.unique 找到第一列和第二列中的唯一值,并返回那些具有最大值的结果 v:

使用lexsortnumpy.unique

def max_xy(a):
res = a[np.lexsort([a[:, 3], a[:, 1], a[:, 0]])[::-1]]
vals, idx = np.unique(res[:, :2], 1, axis=0)
maximums = res[idx]
return maximums[:, [0,1,3]]

array([[ 0,  0,  2],
[ 0, 1, 10],
[ 1, 0, 1]])

为了更好的性能避免unique

def max_xy_v2(a):
res = a[np.lexsort([a[:, 3], a[:, 1], a[:, 0]])[::-1]]
res = res[np.append([True], np.any(np.diff(res[:, :2],axis=0),1))]
return res[:, [0,1,3]]

max_xy_v2(points)

array([[ 1,  0,  1],
[ 0, 1, 10],
[ 0, 0, 2]])

请注意,虽然两者都会返回正确的结果,但它们不会像原始列表那样排序,如果您愿意,您可以在末尾添加另一个 lexsort 来解决这个问题。

关于python - Numpy:从点列表中获取最大值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52408818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com