有没有办法初始化包含这些值而不使用for循环的3行,5列矩阵?
[[0 0 0 0 0
1 1 1 1 1
2 2 2 2 2]]
答案 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的mgrid
,ogrid
和{ {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)]