2017-01-23 139 views
3

我有一个大小为(d,N)的矩阵X.换句话说,每个向量都有N个向量。例如,向量化numpy索引并应用函数来构建矩阵

X = [[1,2,3,4],[5,6,7,8]] 

有d = 2维的N = 4个向量。

另外,我有碎布阵列(列表清单)。索引是索引X矩阵中的列。例如,

I = [ [0,1], [1,2,3] ] 

的I [0] =在矩阵X [0,1]索引的列0和1同样的元件I [1]索引的列1,2和3注意的I族元素是长度不一样的列表!

我想这样做,是指数矩阵X列使用我的每个元素,总结向量,并得到一个载体。对I的每个元素重复此操作,从而构建一个新的矩阵Y.矩阵Y应该具有与I数组中的元素一样多的d维向量。在我的例子中,Y矩阵将有2个2维向量。

在我的例子,该元件I [0]讲述从矩阵X萨姆得到列0和1这两个向量矩阵X的2维矢量,并把该矢量在Y(列0)。然后,元素I [1]告诉对矩阵X的第1,2和3列进行求和,并将这个新的向量置于Y(第1列)。

我可以很容易地使用循环来做到这一点,但如果可能的话,我想向量化这个操作。我的矩阵X有成百上千的列,I索引矩阵有几万个元素(每个元素都是一个简短的索引列表)。

我糊涂代码:

Y = np.zeros((d,len(I))) 
for i,idx in enumerate(I): 
    Y[:,i] = np.sum(X[:,idx], axis=1) 
+0

分享你的多圈的代码,如果你已经实现了? – Divakar

+0

@Divakar加我的代码 –

回答

4

这里有一个方法 -

# Get a flattened version of indices 
idx0 = np.concatenate(I) 

# Get indices at which we need to do "intervaled-summation" along axis=1 
cut_idx = np.append(0,map(len,I))[:-1].cumsum() 

# Finally index into cols of array with flattend indices & perform summation 
out = np.add.reduceat(X[:,idx0], cut_idx,axis=1) 

步骤一步的奔跑 -

In [67]: X 
Out[67]: 
array([[ 1, 2, 3, 4], 
     [15, 6, 17, 8]]) 

In [68]: I 
Out[68]: array([[0, 2, 3, 1], [2, 3, 1], [2, 3]], dtype=object) 

In [69]: idx0 = np.concatenate(I) 

In [70]: idx0 # Flattened indices 
Out[70]: array([0, 2, 3, 1, 2, 3, 1, 2, 3]) 

In [71]: cut_idx = np.append(0,map(len,I))[:-1].cumsum() 

In [72]: cut_idx # We need to do addition in intervals limited by these indices 
Out[72]: array([0, 4, 7]) 

In [74]: X[:,idx0] # Select all of the indexed columns 
Out[74]: 
array([[ 1, 3, 4, 2, 3, 4, 2, 3, 4], 
     [15, 17, 8, 6, 17, 8, 6, 17, 8]]) 

In [75]: np.add.reduceat(X[:,idx0], cut_idx,axis=1) 
Out[75]: 
array([[10, 9, 7], 
     [46, 31, 25]]) 
+0

谢谢!你介意每一行都做什么(在我去查找函数之前)? –