您可以将其表述为outer product:
In [37]: a = np.arange(100000)
In [38]: %timeit np.array([np.linspace(0, i, 4) for i in a])
1 loop, best of 3: 1.3 s per loop
In [39]: %timeit np.outer(a, np.linspace(0, 1, 4))
1000 loops, best of 3: 1.44 ms per loop
这个想法是获取一个单位linspace,然后按a 的每个元素分别对其进行缩放。
如您所见,这使n=100000 的速度提高了约 1000 倍。
为了完整起见,我会提到这段代码与原始版本的舍入属性略有不同(在实际应用中可能不是问题):
In [52]: np.max(np.abs(np.array([np.linspace(0, i, 4) for i in a]) -
...: np.outer(a, np.linspace(0, 1, 4))))
Out[52]: 1.4551915228366852e-11
P。 S. 表达这个想法的另一种方法是使用元素乘法和广播(基于@Scott Gigante 的建议):
In [55]: %timeit a[:, np.newaxis] * np.linspace(0, 1, 4)
1000 loops, best of 3: 1.48 ms per loop
P。 P.S. 请参阅下面的 cmets 以了解有关使其更快的更多想法。