Да, для массива v
, мы можем сначала создать массив numpy с помощью len (v) extra
0:
n = len(V)
m = np.tile(np.concatenate((V, np.zeros(n))), n)[:2*n*n-n]
result = m.reshape(n, 1).T
Для данного списка V
это дает нам:
>>> np.tile(np.concatenate((V, np.zeros(n))), n)[:2*n*n-n].reshape(n,-1).T
array([[10., 0., 0., 0., 0., 0.],
[20., 10., 0., 0., 0., 0.],
[30., 20., 10., 0., 0., 0.],
[40., 30., 20., 10., 0., 0.],
[ 0., 40., 30., 20., 10., 0.],
[ 1., 0., 40., 30., 20., 10.],
[ 0., 1., 0., 40., 30., 20.],
[ 0., 0., 1., 0., 40., 30.],
[ 0., 0., 0., 1., 0., 40.],
[ 0., 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0., 1.]])
Для массива numpy, содержащего 500 элементов и 10 000 запусков, мы получаем:
>>> timeit(f, number=10000)
5.285840999999891
Таким образом, преобразование одного массива из 500 элементов занимает на моей машине 0,5 миллисекунды. Построение всех этих массивов, таким образом, займет примерно 52,86 секунды.
РЕДАКТИРОВАТЬ : Я реализовал три попытки следующим образом:
def wil():
n = len(V)
return np.tile(np.concatenate((V, np.zeros(n))), n)[:2*n*n-n].reshape(n,-1).T
def mii():
n = len(V)
M = np.zeros((2*n-1, n))
for j in range(n):
M[j:j+n,j] = np.transpose(V[:])
return M
def kas():
n = len(V)
ind = np.arange(n)
indices = ((ind[:,None] + ind).ravel() , np.repeat(ind, n))
base = np.zeros((2*n-1, n))
base[indices] = np.tile(V, n)
return base
и сгенерировал случайный массив из 500 элементов:
V = np.random.randn(500)
затем мы запустили тесты с:
>>> timeit(wil, number=10000)
3.461620999999923
>>> timeit(mii, number=10000)
13.704932000000099
>>> timeit(kas, number=10000)
159.63497699999994