我需要解析两个对象随时间变化的位置,并在numpy数组中获取数据:
data = [[0, 1, 2],
[1, 4, 3],
[2, 2, 1]]
因此第一列代表一个位置,第二列代表时间点A在那个特定位置,最后一个列时间是点B在那个位置。保证数据是一致的,也就是说,如果任何两行具有相同的时间-它们在伪代码中具有相同的位置:
data[row1,1] == data[row2,1] <=> data[row1,0] == data[row2,0]
data[row1,2] == data[row2,2] <=> data[row1,0] == data[row2,0]
我想拥有的是以某种方式重铸此数组,以便它将枚举所有可用时间和相应位置,例如:
parsed = [[1, 0, 2],
[2, 2, 0],
[3, np.nan, 1],
[4, 1, np.nan]]
在这里,第一列是时间,第二列是点A的位置,第三列是点B的位置。当我没有关于点位置的信息时,应分配np.nan。我目前要做的是将数据数组分成两个单独的数组:
moments = set (data [:, 1:3].flatten())
for each in moments:
a = data[:,[1,0]][pos[:,1] == each]
b = data[:,[2,0]][pos[:,2] == each]
然后我按照约翰·高尔特(John Galt)的回答重新合并。这可以以某种方式起作用,但是我真的希望可能会有更好的解决方案。有人可以向正确的方向踢我吗?
这是使用NumPy数组初始化和赋值的一种方法-
# Gather a and b indices. Get their union, that represents all posssible indices
a_idx = data[:,1]
b_idx = data[:,2]
all_idx = np.union1d(a_idx, b_idx)
# Setup o/p array
out = np.full((all_idx.size,3),np.nan)
# Assign all indices to first col
out[:,0] = all_idx
# Determine the positions of a indices in all indices and assign first col data
out[np.searchsorted(all_idx, a_idx),1] = data[:,0]
# Similarly for b
out[np.searchsorted(all_idx, b_idx),2] = data[:,0]
np.searchsorted
此处的行为就像天赐之物,因为它为我们提供了需要放入已排序数组中a
和b
从中data
排序的位置,all_idx
并且效率很高。
给定样本数据的输出-
In [104]: out
Out[104]:
array([[ 1., 0., 2.],
[ 2., 2., 0.],
[ 3., nan, 1.],
[ 4., 1., nan]])
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句