, 다음이 합리적으로 빨리해야한다 :이 같은 symmetrize
을 실행하기 전에 두 a[0, 1] = 42
과 모순 a[1, 0] = 123
을 수행하지 합리적인 가정 (아래 작동
def symmetrize(a):
return a + a.T - numpy.diag(a.diagonal())
).
당신이 정말 투명 대칭 화를해야하는 경우 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, :]
요소를 설정하는, a[:, 1] = -1
같은 더 복잡한 과제를 처리합니다. 코드가 약간 파이썬 3 실행하기 전에 적응해야한다, 그래서 파이썬 3, def …(…, (i, j),…)
을 쓰기의 가능성을 제거하는 것이
참고 : def __setitem__(self, indexes, value): (i, j) = indexes
... NumPy와 대칭 행렬의 최적의 치료
출처
2010-04-04 09:06:56
EOL
당신은, 답을 표시하는 것이 좋습니다. :) – EOL
더 나은 (즉 내장형이고 메모리 효율적인) 답변이 오기를 기다리고 싶었습니다. 물론 당신의 대답에는 아무런 문제가 없기 때문에 어쨌든 받아 들일 것입니다. – Debilski