例えば
n_col = 5
a = [1, 2, 3, 4, 5]
という前提で
b = np.zeros((n_col, n_col))
for j in range(n_col):
b[j, j] = 1.0 / (a[j] ** 0.5)
なにやってんの?
a[j] ** 0.5 は a が(例によって)リストで,a[j] はint か float なのだろうから仕方ないが numpy.sqrt(a[j]) と指定したいところだろう。
b = np.diag(1/np.sqrt(a))
の一行ですむところ。何をやろうとしているか,一目でわかる。
np.zeros を知っているのに,np.diag を知らないとは???