从数组值动态填充numpy矩阵?

时间:2013-12-20 05:31:59

标签: python arrays numpy matrix

我正在尝试根据数组的值动态构造一个带有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的值不断变化,所以我需要动态构建这些。

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

编辑:我需要做很多事,所以速度将成为一个问题。我现在唯一可以提出的版本是:

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

但我希望由于for循环这会很慢(如果我有什么要比较的话,我会考虑时间)。

1 个答案:

答案 0 :(得分:3)

怎么样:

>>> 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)

(我改变了(5,5)的形状,因为我对哪个轴哪个轴感到困惑,我想确保使用正确的轴。)

[从(np.arange(len(A[0]))[:,None] < B).T简化 - 如果我们展开B而不是A,则无需进行转置。]