如果你能負擔得起只是在做計算之前,對稱化矩陣,下面應該是相當快的:
def symmetrize(a):
return a + a.T - numpy.diag(a.diagonal())
這個工程在合理的假設(如運行symmetrize
之前沒有做既a[0, 1] = 42
和矛盾a[1, 0] = 123
)。
如果你真的需要一個透明對稱,你可能會考慮繼承numpy.ndarray,只是重新定義__setitem__
:
class SymNDArray(numpy.ndarray):
def __setitem__(self, (i, j), value):
super(SymNDArray, self).__setitem__((i, j), value)
super(SymNDArray, self).__setitem__((j, i), value)
def symarray(input_array):
"""
Returns a symmetrized version of the array-like input_array.
Further assignments to the array are automatically symmetrized.
"""
return symmetrize(numpy.asarray(input_array)).view(SymNDArray)
# Example:
a = symarray(numpy.zeros((3, 3)))
a[0, 1] = 42
print a # a[1, 0] == 42 too!
(或矩陣來代替陣列等效,根據您的需要)。這種方法甚至可以處理更復雜的分配,如a[:, 1] = -1
,它可以正確設置a[1, :]
元素。
注意,Python 3中取出寫def …(…, (i, j),…)
的可能性,所以代碼必須與Python 3運行前會略有調整:def __setitem__(self, indexes, value): (i, j) = indexes
...
來源
2010-04-04 09:06:56
EOL
你可能會考慮標誌着答案被接受,如果它解決您的問題。 :) – EOL 2010-04-08 07:24:21
我想等待一個更好的(即內置和內存有效)答案。當然,你的回答沒有錯,所以我會接受它。 – Debilski 2010-04-09 19:46:58