繁体   English   中英

如何为具有相同第一行值的每个第二行值快速处理 2xN 列表/nparray?

[英]How to fast process 2xN list/nparray for each 2nd row value which has the same 1st row value?

我有一个这样的列表或 numpy 数组:

[[3,   2,   1,   2,   3,   3  ],
 [3.1, 2.2, 1.1, 2.1, 3.3, 3.2]]

基于相同的第一行值,它们应该被分组为以下列表:

[1.1], [2.1,2.2], [3.1,3.2,3.3]

对于上面的每个列表,我想:

sum(abs(list - avg_list))

除了一一找到所有具有相同第一行值的第二行值然后处理它们之外,是否可以有并行处理的解决方案?

我试过的是如下:

a = np.sort(a)
a_0 = np.unique(a[0,:])

result = []
for b in a_0:
  a_1 = np.extract(a[0,:]==b,a[1,:])
  result.append(np.sum(np.abs(a_1-np.mean(a_1))))

这是一种无循环方法。 我 map 使用idxdata放到一个nan填充数组中。 然后使用一些np.nan...函数以排除nan的方式执行数学运算。

In [102]: idx=np.array([3,   2,   1,   2,   3,   3  ])
In [103]: data=np.array([3.1, 2.2, 1.1, 2.1, 3.3, 3.2])
In [104]: res[np.arange(6),idx-1]=data
In [105]: res
Out[105]: 
array([[nan, nan, 3.1],
       [nan, 2.2, nan],
       [1.1, nan, nan],
       [nan, 2.1, nan],
       [nan, nan, 3.3],
       [nan, nan, 3.2]])
In [106]: np.nanmean(res, axis=0)
Out[106]: array([1.1 , 2.15, 3.2 ])
In [107]: res-np.nanmean(res, axis=0)
Out[107]: 
array([[           nan,            nan, -1.0000000e-01],
       [           nan,  5.0000000e-02,            nan],
       [ 0.0000000e+00,            nan,            nan],
       [           nan, -5.0000000e-02,            nan],
       [           nan,            nan,  1.0000000e-01],
       [           nan,            nan, -4.4408921e-16]])
In [108]: np.abs(res-np.nanmean(res, axis=0))
Out[108]: 
array([[          nan,           nan, 1.0000000e-01],
       [          nan, 5.0000000e-02,           nan],
       [0.0000000e+00,           nan,           nan],
       [          nan, 5.0000000e-02,           nan],
       [          nan,           nan, 1.0000000e-01],
       [          nan,           nan, 4.4408921e-16]])
In [109]: np.nansum(np.abs(res-np.nanmean(res, axis=0)), axis=0)
Out[109]: array([0. , 0.1, 0.2])

映射到 0 填充数组也可能有效,因为sum等不会被多余的 0 所困扰。

我不能保证速度。

您的代码缺少结果!

In [110]: a = np.sort(np.array((idx,data)))
     ...: a_0 = np.unique(a[0,:])
     ...: 
     ...: result = []
     ...: for b in a_0:
     ...:   a_1 = np.extract(a[0,:]==b,a[1,:])
     ...:   result.append(np.sum(np.abs(a_1-np.mean(a_1))))
In [111]: result
Out[111]: [0.0, 0.10000000000000009, 0.20000000000000018]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM