2014-09-03 420 views
1

我想解决一个“非常简单”的问题。 Python中不是那么简单。鉴于大矩阵A和另一个较小的矩阵BI想B. 替代A的某些元素在Matlab软件应该是这样的:替换python中特定坐标的矩阵元素

Given A, row_coord = [1,5,6] col_coord = [2,4], and a matrix B of size(3X2), A[row_coord, col_coord] = B 

在Python我试图用product(row_coord, col_coord)itertools,产生该组所有需要在A中可访问的索引,但它不起作用。所有关于子矩阵替换的例子都是以块为单位的row_coord = col_coord例子。除了http://comments.gmane.org/gmane.comp.python.numeric.general/11912似乎与我面临的问题以及链接中的代码不起作用有关外,没有任何具体的内容。

注意:我知道我可以通过double for-loop实现我需要的东西,但是在我的数据中,这样的循环为一次迭代运行增加了9秒,我正在寻找更快的方法来实现这一点。

任何帮助将不胜感激。

+2

您能否提供一些示例矩阵和向量?他们不必非常大,只需测试就可以了。 – Ffisegydd 2014-09-03 12:37:43

+0

是的,当然:A = np.zeros([20,20])col_coord = [0,1,3] row_coord = [1,2] B = 1(让B设为常量)。解决这个问题的简单方法是:对于in row_coord:for b in col_coord:A [row_coord [a],col_coord [b]] = 1,但我想通过使用intertools实用程序使其更快。 。( – user3861925 2014-09-03 13:06:31

回答

0

假设你使用的是numpy数组,那么(在B是标量的情况下),下面的代码应该可以将所选元素赋值为B

itertools.product将创建所有的坐标对我们然后将其转换成numpy数组并使用索引你的原始数组:

import numpy as np 
from itertools import product 

A = np.zeros([20,20]) 

col_coord = [0,1,3] 
row_coord = [1,2] 

coords = np.array(list(product(row_coord, col_coord))) 

B = 1 

A[coords[:,0], coords[:,1]] = B 

我以前this excellent answer by unutbu工作,如何做索引。

+0

非常感谢!它可以根据需要使用,我直接使用A [product(row_coord,col_coord)],而不用强制转换到列表和np.array中,它给了我Traceback(最近的调用最后): IndexError:索引必须是int或序列 – user3861925 2014-09-03 14:36:03

+0

很高兴我可以帮忙:)如果你觉得我的答案对你有帮助,你可以[接受我的回答](http://meta.stackexchange。 COM /一个/204922分之5235)。 – Ffisegydd 2014-09-03 14:49:26