让我们说我有一个二维的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
的统计信息(median
,majority
,sum
,count
,b
,...)根据{{1}}中的“ ID”。
示例:a
应该导致另一个数组(或者列表,如果更容易的话),该数组给出sum
中值的sum
。 b
中有4个唯一的“ ID”:a
,1
,2
,3
和4
中的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]]
答案 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)