gpt4 book ai didi

python - 根据最大值过滤一个numpy数组

转载 作者:太空狗 更新时间:2023-10-29 21:49:41 28 4
gpt4 key购买 nike

我有一个 numpy 数组,它包含具有以下格式 (x, y, z, w) 的 4 维向量

数组的大小是 4 x N。现在,我拥有的数据是我拥有 (x, y, z) 空间位置的位置,w 在此位置保存一些特定的测量值。现在,可能有与 (x, y, z) 位置相关联的多个测量值(以 float 测量)。

我想做的是过滤数组,以便我得到一个新数组,其中我获得与每个 (x, y, z) 位置对应的最大测量值。

所以如果我的数据是这样的:

x, y, z, w1
x, y, z, w2
x, y, z, w3

w1 大于 w2 和 w3,过滤后的数据为:

x, y, z, w1

更具体地说,假设我有这样的数据:

[[ 0.7732126   0.48649481  0.29771819  0.91622924]
[ 0.7732126 0.48649481 0.29771819 1.91622924]
[ 0.58294263 0.32025559 0.6925856 0.0524125 ]
[ 0.58294263 0.32025559 0.6925856 0.05 ]
[ 0.58294263 0.32025559 0.6925856 1.7 ]
[ 0.3239913 0.7786444 0.41692853 0.10467392]
[ 0.12080023 0.74853649 0.15356663 0.4505753 ]
[ 0.13536096 0.60319054 0.82018125 0.10445047]
[ 0.1877724 0.96060999 0.39697999 0.59078612]]

这应该返回

[[ 0.7732126   0.48649481  0.29771819  1.91622924]
[ 0.58294263 0.32025559 0.6925856 1.7 ]
[ 0.3239913 0.7786444 0.41692853 0.10467392]
[ 0.12080023 0.74853649 0.15356663 0.4505753 ]
[ 0.13536096 0.60319054 0.82018125 0.10445047]
[ 0.1877724 0.96060999 0.39697999 0.59078612]]

最佳答案

这很复杂,但它可能和你只使用 numpy 一样好......

首先,我们使用lexsort将具有相同坐标的所有条目放在一起。 a 是您的示例数组:

>>> perm = np.lexsort(a[:, 3::-1].T)
>>> a[perm]
array([[ 0.12080023, 0.74853649, 0.15356663, 0.4505753 ],
[ 0.7732126 , 0.48649481, 0.29771819, 0.91622924],
[ 0.7732126 , 0.48649481, 0.29771819, 1.91622924],
[ 0.1877724 , 0.96060999, 0.39697999, 0.59078612],
[ 0.3239913 , 0.7786444 , 0.41692853, 0.10467392],
[ 0.58294263, 0.32025559, 0.6925856 , 0.0524125 ],
[ 0.58294263, 0.32025559, 0.6925856 , 0.05 ],
[ 0.58294263, 0.32025559, 0.6925856 , 1.7 ],
[ 0.13536096, 0.60319054, 0.82018125, 0.10445047]])

请注意,通过反转轴,我们按 x 排序,然后是 y,然后是 z,然后是 w

因为这是我们正在寻找的最大值,所以我们只需要获取每个组中的最后一个条目,这是一件非常简单的事情:

>>> a_sorted = a[perm]
>>> last = np.concatenate((np.all(a_sorted[:-1, :3] != a_sorted[1:, :3], axis=1),
[True]))
>>> a_unique_max = a_sorted[last]
>>> a_unique_max
array([[ 0.12080023, 0.74853649, 0.15356663, 0.4505753 ],
[ 0.13536096, 0.60319054, 0.82018125, 0.10445047],
[ 0.1877724 , 0.96060999, 0.39697999, 0.59078612],
[ 0.3239913 , 0.7786444 , 0.41692853, 0.10467392],
[ 0.58294263, 0.32025559, 0.6925856 , 1.7 ],
[ 0.7732126 , 0.48649481, 0.29771819, 1.91622924]])

如果您不想对输出进行排序,而是希望它们保持原始数组中出现的原始顺序,您也可以借助 perm 获得:

>>> a_unique_max[np.argsort(perm[last])]
array([[ 0.7732126 , 0.48649481, 0.29771819, 1.91622924],
[ 0.58294263, 0.32025559, 0.6925856 , 1.7 ],
[ 0.3239913 , 0.7786444 , 0.41692853, 0.10467392],
[ 0.12080023, 0.74853649, 0.15356663, 0.4505753 ],
[ 0.13536096, 0.60319054, 0.82018125, 0.10445047],
[ 0.1877724 , 0.96060999, 0.39697999, 0.59078612]])

这只会对最大值起作用,并且它是排序的副产品。如果你追求不同的功能,比如所有相同坐标条目的乘积,你可以这样做:

>>> first = np.concatenate(([True],
np.all(a_sorted[:-1, :3] != a_sorted[1:, :3], axis=1)))
>>> a_unique_prods = np.multiply.reduceat(a_sorted, np.nonzero(first)[0])

您将不得不对这些结果进行一些尝试以组装您的返回数组。

关于python - 根据最大值过滤一个numpy数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052594/

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