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]].
我怎么能得到所有独特的网格点?
您可以进行排序coo,np.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)