所以,我已经浏览stackoverflow很长一段时间了,但我似乎找不到解决我的问题的方法
考虑一下
import numpy as np
coo = np.array([[1, 2], [2, 3], [3, 4], [3, 4], [1, 2], [5, 6], [1, 2]])
values = np.array([1, 2, 4, 2, 1, 6, 1])
coo数组包含(x,y)坐标位置x =(1,2,3,3,1,5,1)y =(2,3,4,4,2,6,2)
而值数组是这个网格点的某种数据。
现在我想得到每个唯一网格点的所有值的平均值。例如,坐标(1,2)出现在位置(0,4,6),所以对于这个点,我想得到values[[0, 4, 6]]
。
如何为所有唯一的网格点获取此信息?
5条答案
按热度按时间k97glaaz1#
可以用
np.lexsort
对coo
进行排序,将重复的XY连续排列起来。然后沿着行运行np.diff
,得到排序版本中唯一XY的开始掩码。使用该掩码,您可以创建一个ID数组,使重复项具有相同的ID。然后,ID数组可以与np.bincount
一起使用,以获得具有相同ID的所有值的总和以及它们的计数,从而获得平均值,作为最终输出。样品运行-
1qczuiv02#
您可以使用
where
:piok6c0g3#
它很可能会更快地拉平你的指数,即:
然后对其使用
np.unique
:比使用
lexsort
的类似方法更有效。但在引擎盖下的方法实际上是相同的。
wd2eg0qa4#
这是一个使用numpy_indexed软件包的简单一行代码(免责声明:我是它的作者):
应该在性能上与目前公认的答案相媲美,就像它在引擎盖下所做的类似事情一样;但是所有这些都包含在一个经过良好测试的软件包中,并且有一个很好的界面。
8gsdolmq5#
另一种方法是使用JAX
unique
和grad
。这种方法可能特别快,因为它允许在加速器(CPU、GPU或TPU)上运行。唯一奇怪的是
size
参数,因为JAX要求所有数组的大小都是固定的,如果你把size
设置得太小,它会给出好的结果,太大,它会返回nan的。