Вы также можете использовать reshape
примерно так:
out = np.zeros((6, 5))
out.reshape(5, 6)[:, 5] = np.arange(2, 7)
out
# array([[0., 0., 0., 0., 0.],
# [2., 0., 0., 0., 0.],
# [0., 3., 0., 0., 0.],
# [0., 0., 4., 0., 0.],
# [0., 0., 0., 5., 0.],
# [0., 0., 0., 0., 6.]])
или очень похоже:
out = np.zeros((6, 5))
out.reshape(-1)[5::6] = np.arange(2, 7)
out
# array([[0., 0., 0., 0., 0.],
# [2., 0., 0., 0., 0.],
# [0., 3., 0., 0., 0.],
# [0., 0., 4., 0., 0.],
# [0., 0., 0., 5., 0.],
# [0., 0., 0., 0., 6.]])
Оба эти метода быстрее, чем все, что опубликовано до сих пор:
import numpy as np
from timeit import timeit
def od_hpj():
out = np.zeros((6, 5))
out[np.arange(1,6), np.arange(5)] = np.arange(2,7)
return out
def od_mm():
return np.diag(np.arange(2,7), k = -1)[:, :-1]
def od_ks():
m = np.zeros([5,])
n = np.diag(np.arange(2,7,1))
return np.vstack((m,n))
def od_as():
zero_row = np.zeros((1,5))
matrix = np.diag(np.arange(2,7,1))
return np.append(zero_row, matrix, axis=0)
def od_pp1():
out = np.zeros((6, 5))
out.reshape(5, 6)[:, 5] = np.arange(2, 7)
return out
def od_pp2():
out = np.zeros((6, 5))
out.reshape(-1)[5::6] = np.arange(2, 7)
return out
for n, o in list(globals().items()):
if n.startswith("od_"):
print(f"{n.replace('od_', ''):3s}: {timeit(o):.3f} us")
Пример прогона:
hpj: 3.379 us
mm : 2.952 us
ks : 7.804 us
as : 5.222 us
pp1: 1.735 us
pp2: 2.418 us