Python में मैट्रिक्स (नेस्टेड सूची) की पंक्तियों को, प्रत्येक पंक्ति में लगातार तत्वों के निरपेक्ष अंतर के योग (sum of absolute consecutive differences) के अनुसार सॉर्ट करना।
सूत्र
पंक्ति [a, b, c, d] के लिए: |b-a| + |c-b| + |d-c|
उदाहरण
def diff_summation_elem(row):
"""लगातार तत्वों के निरपेक्ष अंतर का योग"""
return sum(abs(row[i+1] - row[i]) for i in range(len(row)-1))
my_list = [
[97, 6, 47, 3],
[6, 88, 3, 26],
[71, 53, 34, 65],
[15, 36, 5, 62]
]
print("मूल मैट्रिक्स:")
for i, row in enumerate(my_list):
diff_sum = diff_summation_elem(row)
diffs = [abs(row[j+1]-row[j]) for j in range(len(row)-1)]
print(f" पंक्ति {i}: {row} → अंतर: {diffs} → योग: {diff_sum}")
# सॉर्ट (आरोही: कम अंतर योग पहले)
my_list.sort(key=diff_summation_elem)
print("\nसॉर्ट के बाद (आरोही):")
for row in my_list:
print(f" {row} → योग: {diff_summation_elem(row)}")
आउटपुट
मूल मैट्रिक्स:
पंक्ति 0: [97, 6, 47, 3] → अंतर: [91, 41, 44] → योग: 176
पंक्ति 1: [6, 88, 3, 26] → अंतर: [82, 85, 23] → योग: 190
पंक्ति 2: [71, 53, 34, 65] → अंतर: [18, 19, 31] → योग: 68
पंक्ति 3: [15, 36, 5, 62] → अंतर: [21, 31, 57] → योग: 109
सॉर्ट के बाद (आरोही):
[71, 53, 34, 65] → योग: 68
[15, 36, 5, 62] → योग: 109
[97, 6, 47, 3] → योग: 176
[6, 88, 3, 26] → योग: 190
फंक्शन के रूप में
def sort_by_consecutive_diff_sum(matrix, reverse=False):
"""लगातार अंतर के योग के अनुसार मैट्रिक्स सॉर्ट करें"""
def diff_sum(row):
return sum(abs(row[i+1] - row[i]) for i in range(len(row)-1))
return sorted(matrix, key=diff_sum, reverse=reverse)
# उपयोग
matrix = [
[97, 6, 47, 3],
[6, 88, 3, 26],
[71, 53, 34, 65],
[15, 36, 5, 62]
]
print("आरोही:", sort_by_consecutive_diff_sum(matrix))
print("अवरोही:", sort_by_consecutive_diff_sum(matrix, reverse=True))
NumPy के साथ (वेक्टराइज़्ड, तेज़)
import numpy as np
def diff_sum_numpy(row):
arr = np.array(row)
return np.sum(np.abs(np.diff(arr)))
# 2D सरणी के लिए (सभी पंक्तियाँ समान लंबाई की हों)
matrix_np = np.array([
[97, 6, 47, 3],
[6, 88, 3, 26],
[71, 53, 34, 65],
[15, 36, 5, 62]
])
# प्रत्येक पंक्ति के लिए अंतर योग
diff_sums = np.sum(np.abs(np.diff(matrix_np, axis=1)), axis=1)
print("पंक्ति अंतर योग:", diff_sums) # [176 190 68 109]
# सॉर्ट इंडेक्स
sorted_indices = np.argsort(diff_sums)
print("सॉर्ट इंडेक्स:", sorted_indices) # [2 3 0 1]
sorted_matrix = matrix_np[sorted_indices]
print("सॉर्ट की गई मैट्रिक्स:\n", sorted_matrix)
आउटपुट
पंक्ति अंतर योग: [176 190 68 109]
सॉर्ट इंडेक्स: [2 3 0 1]
सॉर्ट की गई मैट्रिक्स:
[[71 53 34 65]
[15 36 5 62]
[97 6 47 3]
[ 6 88 3 26]]
व्यावहारिक अनुप्रयोग
- स्मूथनेस माप: कम अंतर योग = स्मूथ सीक्वेंस
- सिग्नल प्रोसेसिंग: वेरिएशन/रफनेस मापना
- टाइम सीरीज़: स्थिरता/अस्थिरता मापना
- पाथ ऑप्टिमाइज़ेशन: कम "झटके" वाला पाथ चुनना
विविधताएं
1. वर्ग अंतर योग (Sum of Squared Differences)
def squared_diff_sum(row):
return sum((row[i+1] - row[i])**2 for i in range(len(row)-1))
# यह बड़े अंतर को अधिक दंडित करता है
2. सापेक्ष अंतर (Relative Difference)
def relative_diff_sum(row):
"""प्रतिशत परिवर्तन का योग"""
total = 0
for i in range(len(row)-1):
if row[i] != 0:
total += abs((row[i+1] - row[i]) / row[i])
return total
3. दिशा परिवर्तन गिनना
def count_direction_changes(row):
"""बढ़ते से घटते या vice versa में परिवर्तन"""
if len(row) < 3:
return 0
diffs = [row[i+1] - row[i] for i in range(len(row)-1)]
signs = [1 if d > 0 else (-1 if d < 0 else 0) for d in diffs]
changes = sum(1 for i in range(len(signs)-1) if signs[i] != 0 and signs[i] != signs[i+1])
return changes
print("दिशा परिवर्तन:", [count_direction_changes(r) for r in matrix])