Numpy 从指定数组元素的整数列表创建数组
Numpy create array from list of integers specifying the array elements
假设我们有列表 a = [3,4,2,1]
,我们希望从 a
获得以下数组:b = [0,0,0,1,1,1,1,2,2,3]
.
我已经做到了:
import numpy as np
a = [3,4,2,1]
b = np.concatenate([[i] * n for i, n in enumerate(a])
print(b)
输出:
array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3])
哪个好用,但我不禁想知道是否有更好的方法?
编辑
@mathfux 的解决方案比我简单地使用 np.repeat
的解决方案要优雅得多。我使用 perfplot
对两者进行了基准测试,结果如下:
基准代码:
import numpy as np
import perfplot
out = perfplot.bench(
setup=lambda n: np.arange(n),
kernels=[
lambda x: np.concatenate([[i] * n for i, n in enumerate(x)]),
lambda x: np.repeat(range(len(x)), x)
],
n_range=np.arange(128, 128 * 16, 128),
labels=[
"concat",
"repeat"
],
xlabel='np.arange(x)'
)
out.show()
尝试 np.repeat
:np.repeat([0,1,2,3], [3,4,2,1])
假设我们有列表 a = [3,4,2,1]
,我们希望从 a
获得以下数组:b = [0,0,0,1,1,1,1,2,2,3]
.
我已经做到了:
import numpy as np
a = [3,4,2,1]
b = np.concatenate([[i] * n for i, n in enumerate(a])
print(b)
输出:
array([0, 0, 0, 1, 1, 1, 1, 2, 2, 3])
哪个好用,但我不禁想知道是否有更好的方法?
编辑
@mathfux 的解决方案比我简单地使用 np.repeat
的解决方案要优雅得多。我使用 perfplot
对两者进行了基准测试,结果如下:
import numpy as np
import perfplot
out = perfplot.bench(
setup=lambda n: np.arange(n),
kernels=[
lambda x: np.concatenate([[i] * n for i, n in enumerate(x)]),
lambda x: np.repeat(range(len(x)), x)
],
n_range=np.arange(128, 128 * 16, 128),
labels=[
"concat",
"repeat"
],
xlabel='np.arange(x)'
)
out.show()
尝试 np.repeat
:np.repeat([0,1,2,3], [3,4,2,1])