根据第二个numpy数组中的值计算一个numpy数组的统计信息

时间:2018-11-27 05:00:29

标签: numpy statistics numpy-ndarray

让我们说我有一个二维的numpy数组

a = np.array([[1, 1, 2, 2],
              [1, 1, 2, 2],
              [3, 3, 4, 4],
              [3, 3, 4, 4]]

和一个3-d numpy数组,如

b = np.array([[[1, 2, 8, 8],
               [3, 4, 8, 8],
               [8, 7, 0, 1],
               [6, 5, 3, 2]],
              [[1, 1, 1, 3],
               [1, 1, 4, 2],
               [0, 3, 2, 1],
               [3, 2, 3, 9]]])

我要计算mean的统计信息(medianmajoritysumcountb,...)根据{{​​1}}中的“ ID”。

示例:a应该导致另一个数组(或者列表,如果更容易的话),该数组给出sum中值的sumb中有4个唯一的“ ID”:a1234中的2个“层”。 b中的1等于10(第0层)和4(第1层)之和。对于2  它是32(第0层)和10(第1层),依此类推...

a的预期结果:

sum

sums = [[1, 10, 4], [2, 32, 10], [3, 26, 8], [4, 6, 15]] 的预期结果:

mean

我的猜测是,numpy中已经有一个方便的函数可以执行此操作,但是我不确定确切要搜索什么。非常感谢您提供有关执行操作或搜索内容的任何指示。

更新

我想出了这个for循环,非常适合非常小的数组。但是,我的数组比4乘4大得多,并且需要更快的插入速度。

avgs = [[1, 2.5, 1.0 ],
        [2, 8.0, 2.5 ],
        [3, 6.5, 2.0 ],
        [4, 1.5, 3.75]]

1 个答案:

答案 0 :(得分:0)

您可以尝试下面的代码

cal_sums = [[b[j, :, :][np.argwhere(a==i)[:,0],np.argwhere(a==i)[:,1]].sum() 
             for i in np.unique(a)] for j in range(2)]
cal_mean = [[b[j, :, :][np.argwhere(a==i)[:,0],np.argwhere(a==i)[:,1]].mean() 
             for i in np.unique(a)] for j in range(2)]

sums  = np.zeros((np.unique(a).size, b.shape[0]+1))
means = np.zeros((np.unique(a).size, b.shape[0]+1))

sums[:, 0] , sums[:,1:] = np.unique(a), np.asarray(cal_sums).T
means[:, 0] , means[:,1:] = np.unique(a), np.asarray(cal_mean).T

print(sums)
[[ 1. 10.  4.]
 [ 2. 32. 10.]
 [ 3. 26.  8.]
 [ 4.  6. 15.]]

print(means)

[[1.   2.5  1.  ]
 [2.   8.   2.5 ]
 [3.   6.5  2.  ]
 [4.   1.5  3.75]]

我以相当大的阵列大小对其进行了测试,而且速度很快

n = 1000
a = np.random.randint(1, 5, size=(n, n))
b = np.random.randint(1, 10, size=(2, n, n))

速度:

377 ms ± 3.04 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)