在一般情況下,當你想通過標籤來概括子矩陣可以使用下面的代碼
import numpy as np
from scipy.sparse import coo_matrix
def labeled_sum1(x, labels):
P = coo_matrix((np.ones(x.shape[0]), (labels, np.arange(len(labels)))))
res = P.dot(x.reshape((x.shape[0], np.prod(x.shape[1:]))))
return res.reshape((res.shape[0],) + x.shape[1:])
def labeled_sum2(x, labels):
res = np.empty((np.max(labels) + 1,) + x.shape[1:], x.dtype)
for i in np.ndindex(x.shape[1:]):
res[(...,)+i] = np.bincount(labels, x[(...,)+i])
return res
第一種方法是使用稀疏矩陣乘法。第二個是user333700答案的概括。這兩種方法都有相當的速度:
x = np.random.randn(100000, 10, 10)
labels = np.random.randint(0, 1000, 100000)
%time res1 = labeled_sum1(x, labels)
%time res2 = labeled_sum2(x, labels)
np.all(res1 == res2)
輸出:
Wall time: 73.2 ms
Wall time: 68.9 ms
True
這將是一個更加清晰,如果'D'的價值是獨一無二的。例如,如果'd = [0,1,2,3,4]'我猜'i = [0,0,0,0,0]'你想'c = [10]',while對於'我= [0,0,1,2,2]'你想'c = [1,2,7]'? – mtrw 2010-08-31 08:20:21
這是正確的。感謝澄清。 – dzhelil 2010-08-31 18:01:58
在這種情況下,juxstapose的解決方案,以及我在評論中建議的更改應該能夠做到。 – mtrw 2010-08-31 19:53:17