2024-04-25 23:09:29 发布
网友
有没有一种方法可以在不使用for循环的情况下初始化包含这些值的3行5列矩阵?你知道吗
[[0 0 0 0 0 1 1 1 1 1 2 2 2 2 2]]
如果您正在处理大型数据集并且担心性能,那么您可能需要考虑将数据放入二维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的mgrid、ogrid和meshgrid函数)。使用^{}的第二个解决方案只生成所需的值,当我将矩阵的大小增加到(3000, 5000)时,在我的机器上完成的速度大约是原来的两倍:
(2, 3, 5)
np.indices
mgrid
ogrid
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
尽管如此,以这种方式使用np.repeat在NumPy中还是有点反模式的:通常最好通过创建一个包含3行和单个列的2d数组来避免重复,并在与其他数组组合时依赖NumPy的broadcasting来正确解释。如果你走那条路,你只需要:
np.repeat
>>> np.arange(3)[:, np.newaxis] array([[0], [1], [2]])
这是一个shape (3, 1)数组;使用shape (5,)或(1, 5)数组(例如)的后续操作将服从NumPy的广播规则,从而产生shape (3, 5)的输出。例如,当我们在上面添加一个一维零数组时,会发生以下情况:
(3, 1)
(5,)
(1, 5)
(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]])
对于3和5这两个大值,所有这些解决方案都应该具有相当相似的性能;如果这是一个瓶颈,您需要在计算机上进行计时,以决定使用哪个。在我的机器上,+np.zeros广播解决方案在一定程度上胜过其他解决方案。你知道吗
3
5
+np.zeros
这是可能的。你知道吗
i = 0 matrix = [] while i <=2: matrix += [[i]*5] i += 1
没有任何for循环或列表理解,您可以使用内置函数的组合:
for
map(list, zip(*[range(3)] * 5))
如果您正在处理大型数据集并且担心性能,那么您可能需要考虑将数据放入二维NumPy数组中。以下是在NumPy中生成所需矩阵的几种方法:
第一个比较简单,但有点浪费:^{} 调用实际生成所需的数组(可以视为行索引数组)以及列索引的伴随数组:
将两个数组方便地打包成一个形状为} 的第二个解决方案只生成所需的值,当我将矩阵的大小增加到
(2, 3, 5)
的数组。如果你需要第二个数组来做你正在做的事情,那么np.indices
就是最好的方法(尽管在这种情况下,你可能还需要研究NumPy的mgrid
、ogrid
和meshgrid
函数)。使用^{(3000, 5000)
时,在我的机器上完成的速度大约是原来的两倍:尽管如此,以这种方式使用
np.repeat
在NumPy中还是有点反模式的:通常最好通过创建一个包含3行和单个列的2d数组来避免重复,并在与其他数组组合时依赖NumPy的broadcasting来正确解释。如果你走那条路,你只需要:这是一个shape
(3, 1)
数组;使用shape(5,)
或(1, 5)
数组(例如)的后续操作将服从NumPy的广播规则,从而产生shape(3, 5)
的输出。例如,当我们在上面添加一个一维零数组时,会发生以下情况:为了完整性,这里还有一个变体,使用^{} :
对于
3
和5
这两个大值,所有这些解决方案都应该具有相当相似的性能;如果这是一个瓶颈,您需要在计算机上进行计时,以决定使用哪个。在我的机器上,+np.zeros
广播解决方案在一定程度上胜过其他解决方案。你知道吗这是可能的。你知道吗
没有任何
for
循环或列表理解,您可以使用内置函数的组合:相关问题 更多 >
编程相关推荐