在python中初始化numb行的矩阵

2024-04-25 23:09:29 发布

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

有没有一种方法可以在不使用for循环的情况下初始化包含这些值的3行5列矩阵?你知道吗

[[0 0 0 0 0
 1 1 1 1 1
 2 2 2 2 2]]

Tags: 方法for情况矩阵
3条回答

如果您正在处理大型数据集并且担心性能,那么您可能需要考虑将数据放入二维NumPy数组中。以下是在NumPy中生成所需矩阵的几种方法:

>>> import numpy as np
>>> np.indices((3, 5))[0]
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])
>>> np.repeat(np.arange(3), 5).reshape((3, 5))
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

第一个比较简单,但有点浪费:^{}调用实际生成所需的数组(可以视为行索引数组)以及列索引的伴随数组:

>>> np.indices((3, 5))[1]
array([[0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4],
       [0, 1, 2, 3, 4]])

将两个数组方便地打包成一个形状为(2, 3, 5)的数组。如果你需要第二个数组来做你正在做的事情,那么np.indices就是最好的方法(尽管在这种情况下,你可能还需要研究NumPy的mgridogridmeshgrid函数)。使用^{}的第二个解决方案只生成所需的值,当我将矩阵的大小增加到(3000, 5000)时,在我的机器上完成的速度大约是原来的两倍:

In [19]: %timeit np.indices((3000, 5000))[0]
10 loops, best of 3: 156 ms per loop

In [20]: %timeit np.repeat(np.arange(3000), 5000).reshape((3000, 5000))
10 loops, best of 3: 88.4 ms per loop

尽管如此,以这种方式使用np.repeat在NumPy中还是有点反模式的:通常最好通过创建一个包含3行和单个列的2d数组来避免重复,并在与其他数组组合时依赖NumPy的broadcasting来正确解释。如果你走那条路,你只需要:

>>> np.arange(3)[:, np.newaxis]
array([[0],
       [1],
       [2]])

这是一个shape (3, 1)数组;使用shape (5,)(1, 5)数组(例如)的后续操作将服从NumPy的广播规则,从而产生shape (3, 5)的输出。例如,当我们在上面添加一个一维零数组时,会发生以下情况:

>>> np.arange(3)[:, np.newaxis] + np.zeros(5, dtype=int)
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

为了完整性,这里还有一个变体,使用^{}

>>> np.tile(np.arange(3)[:, np.newaxis], (1, 5))
array([[0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2]])

对于35这两个大值,所有这些解决方案都应该具有相当相似的性能;如果这是一个瓶颈,您需要在计算机上进行计时,以决定使用哪个。在我的机器上,+np.zeros广播解决方案在一定程度上胜过其他解决方案。你知道吗

这是可能的。你知道吗

i = 0
matrix = []
while i <=2:
    matrix += [[i]*5]
    i += 1

没有任何for循环或列表理解,您可以使用内置函数的组合:

map(list, zip(*[range(3)] * 5))

相关问题 更多 >