【发布时间】:2019-02-12 01:34:51
【问题描述】:
有没有更好的方法将数组中的元素一个一个地插入
到所有可能的位置(n+1 个位置)。
例如,将 [1] 插入到 [6 7 8 9] 应该会产生:
[1 6 7 8 9]
[9 1 6 7 8]
[8 9 1 6 7]
[7 8 9 1 6]
[6 7 8 9 1]
所以如果我将A = [1 2 3] 一个一个插入到 B = [6 7 8 9] 它应该产生:
[1 6 7 8 9]
[9 1 6 7 8]
[8 9 1 6 7]
[7 8 9 1 6]
[6 7 8 9 1]
--------------------
[2 6 7 8 9]
[9 2 6 7 8]
[8 9 2 6 7]
[7 8 9 2 6]
[6 7 8 9 2]
--------------------
[3 6 7 8 9]
[9 3 6 7 8]
[8 9 3 6 7]
[7 8 9 3 6]
[6 7 8 9 3]
--------------------
目前我像这样使用numpy.roll:
import numpy as np
import timeit
A = np.array([1, 2, 3, 4, 5])
B = np.array([6, 7, 8, 9])
def inject_one(Ad, Bd):
for i, _ in enumerate(Ad):
C = np.append(Ad[i], Bd)
for _ in range(len(C) - 1):
C = np.roll(C, 1)
t = timeit.Timer(lambda: inject_one(A, B))
print("{:.3f}secs for 1000 iterations".format(t.timeit(number=1000)))
# > 0.160 secs
【问题讨论】:
-
np.append只是np.concatenate的前端;它不是append克隆列表。因此,在循环中重复应用时效率不高。 -
如果你的问题是滚动列表,所以最后一个数字在前,你可以写 outa = list[-1]+list[:-1]
-
你不是在每个可能的位置插入,而是在开头插入然后滚动你的列表。
-
@user3483203 是的,没错……但我会做任何更快的事情。
-
@JonasWolff 你的解决方案很好,为什么要删除它?
标签: python python-3.x algorithm numpy matrix