Numpy:与唯一坐标位置对应的值的平均值

Han*_*nah 10 python arrays numpy

所以,我一直在浏览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])
Run Code Online (Sandbox Code Playgroud)

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]].

我怎么能得到所有独特的网格点?

Div*_*kar 6

您可以进行排序coonp.lexsort以使重复的内容连续出现。然后np.diff沿着行运行,以获取排序版本中唯一XY的开始的掩码。使用该掩码,您可以创建一个ID数组,该ID数组对于重复项具有相同的ID。然后,可以将ID数组用于np.bincount获得具有相同ID的所有值的总和,以及它们的计数以及平均值,作为最终输出。这是遵循这些原则的实现-

# Use lexsort to bring duplicate coo XY's in succession
sortidx = np.lexsort(coo.T)
sorted_coo =  coo[sortidx]

# Get mask of start of each unique coo XY
unqID_mask = np.append(True,np.any(np.diff(sorted_coo,axis=0),axis=1))

# Tag/ID each coo XY based on their uniqueness among others
ID = unqID_mask.cumsum()-1

# Get unique coo XY's
unq_coo = sorted_coo[unqID_mask]

# Finally use bincount to get the summation of all coo within same IDs 
# and their counts and thus the average values
average_values = np.bincount(ID,values[sortidx])/np.bincount(ID)
Run Code Online (Sandbox Code Playgroud)

样品运行-

In [65]: coo
Out[65]: 
array([[1, 2],
       [2, 3],
       [3, 4],
       [3, 4],
       [1, 2],
       [5, 6],
       [1, 2]])

In [66]: values
Out[66]: array([1, 2, 4, 2, 1, 6, 1])

In [67]: unq_coo
Out[67]: 
array([[1, 2],
       [2, 3],
       [3, 4],
       [5, 6]])

In [68]: average_values
Out[68]: array([ 1.,  2.,  3.,  6.])
Run Code Online (Sandbox Code Playgroud)