2016-10-26 3 views
1

Я увидел функцию numpy.fill_diagonal, которая присваивает одинаковое значение для диагональных элементов. Но я хочу назначить разные случайные значения для каждого диагонального элемента. Как я могу сделать это в python? Может быть использовать scipy или другие библиотеки?Заполнить матрицу диагональю с разными значениями для каждого числа python

ответ

2

Вы можете использовать np.diag_indices, чтобы получить эти индексы, а затем просто индексировать в массив с этими параметрами и присваивать значения.

Вот пример запуска для иллюстрации -

In [86]: arr   # Input array 
Out[86]: 
array([[13, 69, 35, 98, 16], 
     [93, 42, 72, 51, 65], 
     [51, 33, 96, 43, 53], 
     [15, 26, 16, 17, 52], 
     [31, 54, 29, 95, 80]]) 

# Get row, col indices 
In [87]: row,col = np.diag_indices(arr.shape[0]) 

# Assign values, let's say from an array to illustrate 
In [88]: arr[row,col] = np.array([100,200,300,400,500]) 

In [89]: arr 
Out[89]: 
array([[100, 69, 35, 98, 16], 
     [ 93, 200, 72, 51, 65], 
     [ 51, 33, 300, 43, 53], 
     [ 15, 26, 16, 400, 52], 
     [ 31, 54, 29, 95, 500]]) 

Вы также можете использовать np.diag_indices_from и, вероятно, будет более idomatic, как так -

row, col = np.diag_indices_from(arr) 
+0

Благодаря Divakar. Но я хочу, чтобы это было сделано в матрице. Не в массиве. Далее, как я могу дать основные диагональные элементы случайных значений, не указанных в массиве? – Shyamkkhadka

+1

@ Шямкхадка Думайте, что это должно работать так же хорошо и на матрицах NumPy без каких-либо изменений. Вы даже пробовали код? Кроме того, в назначающей части это 'np.array ([100,200,300,400,500]) является просто примером. Мы можем назначить что-нибудь там, например 'arr [row, col] = np.random.randint (0,9, (5))'. – Divakar

+0

Спасибо @ Дивакар. Это сработало. – Shyamkkhadka

Смежные вопросы