Лучше использовать индекс numpy для установки матрицы:
In [358]: arr = np.random.random((4,4))
In [359]: arr[[0,3],:] = 0
In [360]: arr[:,[0,3]] = 0
In [361]: arr[3,1:-1] = 10
In [362]: arr
Out[362]:
array([[ 0. , 0. , 0. , 0. ],
[ 0. , 0.8869947 , 0.61765067, 0. ],
[ 0. , 0.92640868, 0.83014953, 0. ],
[ 0. , 10. , 10. , 0. ]])
или даже:
In [363]: arr = np.zeros((4,4))
In [364]: arr[1:-1,1:-1] = np.random.random((4-2,4-2))
In [365]: arr
Out[365]:
array([[0. , 0. , 0. , 0. ],
[0. , 0.50803298, 0.78055366, 0. ],
[0. , 0.98941105, 0.61842531, 0. ],
[0. , 0. , 0. , 0. ]])
Я подозреваю, что ваша другая итерация может быть переписана для эффективного использования массива методы, но я не буду заниматься этим сейчас.
Вот разница, о которой я упоминал в комментариях:
In [367]: with np.nditer(arr, op_flags=['readwrite']) as it:
...: for x in it:
...: print(type(x), x)
...:
<class 'numpy.ndarray'> 0.0
<class 'numpy.ndarray'> 0.0
<class 'numpy.ndarray'> 0.0
...
In [368]: for index,x in np.ndenumerate(arr):
...: print(type(x),x)
...:
<class 'numpy.float64'> 0.0
<class 'numpy.float64'> 0.0
<class 'numpy.float64'> 0.0
....
и использование multi_Index:
In [369]: with np.nditer(arr, op_flags=['readwrite'],flags=['multi_index']) as it:
...: for x in it:
...: print(type(x), x, it.multi_index)
...:
<class 'numpy.ndarray'> 0.0 (0, 0)
...
<class 'numpy.ndarray'> 0.5080329836279988 (1, 1)
<class 'numpy.ndarray'> 0.7805536642151875 (1, 2)