用x零和其余的零来实例化一个矩阵

2024-04-24 06:11:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够快速实例化一个矩阵,其中一行中的前几个(可变数量)单元格为0,其余为1。在

假设我们需要一个3x4矩阵。在

我首先将矩阵实例化为所有矩阵:

ones = np.ones([4,3])

然后假设我们有一个数组,它宣布有多少个前导零:

^{pr2}$

要求结果:

^{3}$

显然,这也可以用相反的方式来实现,但是我会考虑用1作为默认值,并替换零的方法。在

什么是避免一些愚蠢的循环的最好方法?在


Tags: 实例方法数量np方式ones矩阵数组
2条回答

虽然没有我想要的那么简洁(我正在试验^{}),但这也可以完成以下工作:

>>> n = 3
>>> zeros = [2, 1, 3, 0]
>>> numpy.array([[0] * zeros[i] + [1]*(n - zeros[i]) for i in range(len(zeros))])
array([[0, 0, 1],
       [0, 1, 1],
       [0, 0, 0],
       [1, 1, 1]])
>>>

工作非常简单:串联所需的倍数,一个元素列出[0]和{},逐行创建数组。在

有一个办法。n是结果中的列数。行数由len(arr)决定。在

In [29]: n = 5

In [30]: arr = np.array([1, 2, 3, 0, 3])

In [31]: (np.arange(n) >= arr[:, np.newaxis]).astype(int)
Out[31]: 
array([[0, 1, 1, 1, 1],
       [0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1]])

有两个部分来解释这是如何工作的。首先,如何创建一个有m个零和n-m个一的行?为此,我们使用np.arange创建一个值为[0,1,…,n-1]的行:

^{pr2}$

接下来,将该数组与m进行比较:

In [37]: m = 2

In [38]: np.arange(n) >= m
Out[38]: array([False, False,  True,  True,  True], dtype=bool)

它给出了一个布尔值数组;第一个m值为False,其余为True。通过将这些值转换为整数,我们得到了一个由0和1组成的数组:

In [39]: (np.arange(n) >= m).astype(int)
Out[39]: array([0, 0, 1, 1, 1])

要在m值的数组上执行此操作,我们使用broadcasting;这是解释的第二个关键思想。在

请注意arr[:, np.newaxis]给出了什么:

In [40]: arr
Out[40]: array([1, 2, 3, 0, 3])

In [41]: arr[:, np.newaxis]
Out[41]: 
array([[1],
       [2],
       [3],
       [0],
       [3]])

也就是说,arr[:, np.newaxis]arr重塑为一个具有形状(5,1)的二维数组。(arr.reshape(-1, 1)本可以改为使用)现在,当我们将其与np.arange(n)(长度为n的一维数组)进行比较时,广播开始起作用:

In [42]: np.arange(n) >= arr[:, np.newaxis]
Out[42]: 
array([[False,  True,  True,  True,  True],
       [False, False,  True,  True,  True],
       [False, False, False,  True,  True],
       [ True,  True,  True,  True,  True],
       [False, False, False,  True,  True]], dtype=bool)

正如@RogerFan在他的评论中指出的,这基本上是参数的一个外积,使用>=操作。在

对类型int的最终强制转换将得到所需的结果:

In [43]: (np.arange(n) >= arr[:, np.newaxis]).astype(int)
Out[43]: 
array([[0, 1, 1, 1, 1],
       [0, 0, 1, 1, 1],
       [0, 0, 0, 1, 1],
       [1, 1, 1, 1, 1],
       [0, 0, 0, 1, 1]])

相关问题 更多 >