तुम सिर्फ गणना करने से पहले मैट्रिक्स सुडौल बनाना करने के लिए खर्च कर सकते हैं, तो निम्न यथोचित तेजी से किया जाना चाहिए:
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, :]
तत्वों को सही ढंग से सेट करता है।
ध्यान दें कि अजगर 3, इसलिए कोड थोड़ा अजगर 3 के साथ चलाने से पहले अनुकूलित किया जाना है def …(…, (i, j),…)
लेखन की संभावना हटाया: def __setitem__(self, indexes, value): (i, j) = indexes
...
आप अगर यह आपकी समस्या नहीं सुलझती, के रूप में स्वीकार किए जाते हैं जवाब अंकन सोच सकते हैं। :) – EOL
मैं आने के लिए एक बेहतर (यानी अंतर्निर्मित और स्मृति-कुशल) उत्तर का इंतजार करना चाहता था। निश्चित रूप से आपके उत्तर में कुछ भी गलत नहीं है, इसलिए मैं इसे वैसे भी स्वीकार करूंगा। – Debilski