gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:19:59 24 4
gpt4 key购买 nike

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

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

我首先实例化了矩阵:

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

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

arr = np.array([2,1,3,0]) # first row has 2 zeroes, second row 1 zero, etc

要求的结果:

array([[0, 0, 1],
[0, 1, 1],
[0, 0, 0],
[1, 1, 1]])

显然这也可以以相反的方式完成,但我会考虑将 1 设为默认值并替换零的方法。

避免愚蠢循环的最佳方法是什么?

最佳答案

这是一种方法。 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] 的行:

In [35]: n
Out[35]: 5

In [36]: np.arange(n)
Out[36]: array([0, 1, 2, 3, 4])

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

In [37]: m = 2

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

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

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

要对m 值(您的arr)的数组 执行此操作,我们使用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 reshape 为形状为 (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]])

关于python - 用 x 个零和其余的实例化一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com