2013-12-20 33 views
2

我试图动态地构造基于数组的值与numpy的2-d矩阵,如下所示:从数组值中动态填充numpy矩阵?

In [113]: A = np.zeros((5,5),dtype=bool) 
In [114]: A 
Out[114]: array([[False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False]], dtype=bool) 

In [116]: B = np.array([0,1,3,0,2]) 

In [117]: B 
Out[117]: array([0, 1, 3, 0, 2]) 

现在,我想使用B的值赋给了第一将每行的n个值设置为A为True。对于这种A和B,正确的输出将是:

In [118]: A 
Out[118]: array([[False, False, False, False, False], 
    [ True, False, False, False, False], 
    [ True, True, True, False, False], 
    [False, False, False, False, False], 
    [ True, True, False, False, False]], dtype=bool) 

B的长度将总是等于A的行数,和B的值将总是小于或等于的数A的列.A的大小和B的值不断变化,所以我需要动态构建它们。

我确信这在numpy中有一个简单的( - )解决方案,但是我花了最后一个小时来对抗重复,瓦片和我能想到的任何其他变化。在我给自己脑震荡之前,任何人都可以帮助我吗? :)

编辑:我将需要做很多,所以速度将是一个问题。我能想出现在唯一的版本是这样的:

np.vstack([ [True]*x + [False]*(500-x) for x in B ]) 

但我相信,这将是缓慢的,由于for循环(我就会暂停,如果我有什么比较它)。

回答

3

怎么样:(我是从(5,5)改变了形状,因为我弄不清哪个轴是哪个,我想确保我用的是正确的)

>>> A = np.zeros((5, 7),dtype=bool) 
>>> B = np.array([0,1,3,0,2]) 
>>> (np.arange(len(A[0])) < B[:,None]) 
array([[False, False, False, False, False, False, False], 
     [ True, False, False, False, False, False, False], 
     [ True, True, True, False, False, False, False], 
     [False, False, False, False, False, False, False], 
     [ True, True, False, False, False, False, False]], dtype=bool) 

[简体从(np.arange(len(A[0]))[:,None] < B).T - 如果我们扩大B而不是A,没有必要对转]

+1

甜蜜的圣诞节,这是很好的!而且太快了......谢谢! – Winawer

+0

请注意,您不需要实际构建'A'--我只是用它来检查形状。所有你需要的是数字'len(A [0])'和'B'。 – DSM