在行号的python中初始化一个矩阵

时间:2015-04-12 12:44:04

标签: python list

有没有办法初始化包含这些值而不使用for循环的3行,5列矩阵?

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

5 个答案:

答案 0 :(得分:2)

这是可能的。

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

如果您正在处理大型数据集并担心性能问题,您可能需要考虑将数据放入二维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调用实际上生成了你想要的数组(可以被视为行索引数组)以及列索引的伴随数组:

>>> 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的mgridogrid和{ {1}}功能)。使用np.repeat的第二个解决方案只生成您需要的值,毫不奇怪,当我将矩阵的大小增加到meshgrid时,我的机器上的速度大约快两倍:

(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 在NumPy中是一个反模式:通过创建一个包含3行和单个列,并且当它与其他数组结合时依赖NumPy的broadcasting来正确解释它。如果你这样做,你只需要:

np.repeat

这是一个形状>>> np.arange(3)[:, np.newaxis] array([[0], [1], [2]]) 的数组;具有形状(3, 1)(5,)(例如)的数组的后续操作将受NumPy的广播规则约束,产生形状(1, 5)的输出。例如,当我们向上面添加一个零的数组时会发生什么:

(3, 5)

为了完整起见,这里还有一个变体,使用np.tile

>>> 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]]) 3的大值,所有这些解决方案应具有相当类似的性能;如果这是一个瓶颈,你会想要在你的机器上做时间决定使用哪个。在我的机器上,5广播解决方案在一定程度上击败了其他广播解决方案。

答案 3 :(得分:0)

这是了解Python初学者的简单方法之一。

matrix = []
for data in range(3):
    matrix.append([data] * 5)

答案 4 :(得分:0)

这可以使用:

[[data] * 5 for data in range(3)]