2014-10-30 3 views
2

У меня есть следующая матрица в NumpyВычесть транспонировать из матрицы, но сохранить оригинальный диагональный

mat = numpy.random.random_integers(0, 100, (3, 3)) 
     A B C 
    A [69, 88, 64], 
    B [92, 17, 35], 
    C [ 8, 74, 39] 

Есть ли вещий способ (т.е. избежать вложенных циклов) вычесть мат (A, B) от мата (B , А); мат (A, C) от мата (C, A) и т. д ....? Диагональные элементы можно оставить в покое. Результат должен быть:

 A  B  C 
    A [69, 88-92, 64-8], 
    B [92-88, 17, 35-74], 
    C [8-64, 74-35, 39] 

который становится:

 A B C 
    A [69, -4, 56], 
    B [4, 17, -39], 
    C [-56, 39, 39] 

ответ

4

Вы можете сделать недиагональными условия достаточно легко:

>>> mat = np.array([[69, 88, 64], [92, 17, 35], [8, 74, 39]]) 
>>> mat 
array([[69, 88, 64], 
     [92, 17, 35], 
     [ 8, 74, 39]]) 
>>> mat - mat.T 
array([[ 0, -4, 56], 
     [ 4, 0, -39], 
     [-56, 39, 0]]) 

Чтобы положить диагонали назад, вы могли бы сделать

>>> m = (mat - mat.T) + np.diag(np.diag(mat)) 
>>> m 
array([[ 69, -4, 56], 
     [ 4, 17, -39], 
     [-56, 39, 39]]) 

или, может быть:

>>> m = (mat - mat.T) 
>>> np.fill_diagonal(m, mat.diagonal()) 
>>> m 
array([[ 69, -4, 56], 
     [ 4, 17, -39], 
     [-56, 39, 39]]) 
+0

Ударьте меня примерно за минуту – Paul

+0

спасибо! очень ясный пример ... – user308827

1
mata = mat 
matb = mat - matrix.transpose(mat) 
for i in range(len(mat)): 
    matb[i][i] = mata[i][i] 

ли эти петли слишком вложенными?

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