2024-04-24 06:11:50 发布
网友
我希望能够快速实例化一个矩阵,其中一行中的前几个(可变数量)单元格为0,其余为1。在
假设我们需要一个3x4矩阵。在
我首先将矩阵实例化为所有矩阵:
ones = np.ones([4,3])
然后假设我们有一个数组,它宣布有多少个前导零:
要求结果:
显然,这也可以用相反的方式来实现,但是我会考虑用1作为默认值,并替换零的方法。在
什么是避免一些愚蠢的循环的最好方法?在
虽然没有我想要的那么简洁(我正在试验^{}),但这也可以完成以下工作:
>>> 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]和{},逐行创建数组。在
[0]
有一个办法。n是结果中的列数。行数由len(arr)决定。在
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]的行:
m
n-m
np.arange
接下来,将该数组与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]给出了什么:
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的一维数组)进行比较时,广播开始起作用:
arr
arr.reshape(-1, 1)
np.arange(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的最终强制转换将得到所需的结果:
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]])
虽然没有我想要的那么简洁(我正在试验^{} ),但这也可以完成以下工作:
工作非常简单:串联所需的倍数,一个元素列出},逐行创建数组。在
[0]
和{有一个办法。
n
是结果中的列数。行数由len(arr)
决定。在有两个部分来解释这是如何工作的。首先,如何创建一个有
^{pr2}$m
个零和n-m
个一的行?为此,我们使用np.arange
创建一个值为[0,1,…,n-1]的行:接下来,将该数组与
m
进行比较:它给出了一个布尔值数组;第一个
m
值为False,其余为True。通过将这些值转换为整数,我们得到了一个由0和1组成的数组:要在
m
值的数组上执行此操作,我们使用broadcasting;这是解释的第二个关键思想。在请注意
arr[:, np.newaxis]
给出了什么:也就是说,
arr[:, np.newaxis]
将arr
重塑为一个具有形状(5,1)的二维数组。(arr.reshape(-1, 1)
本可以改为使用)现在,当我们将其与np.arange(n)
(长度为n
的一维数组)进行比较时,广播开始起作用:正如@RogerFan在他的评论中指出的,这基本上是参数的一个外积,使用
>=
操作。在对类型
int
的最终强制转换将得到所需的结果:相关问题 更多 >
编程相关推荐