Tôi có 2 danh sách số nguyên Python. Các danh sách có thể có kích thước khác nhau. Một là danh sách các chỉ số của tất cả các cực đại trong tập dữ liệu và một là danh sách các chỉ số của tất cả các cực tiểu. Tôi muốn lập một danh sách các giá trị tối đa và số phút liên tiếp theo thứ tự và bỏ qua các trường hợp, chẳng hạn như 2 phút nằm giữa 2 giá trị tối đa
Tốc độ quan trọng nhất, vì vậy tôi đang hỏi làm thế nào những điều sau đây có thể được thực hiện nhanh nhất [tôi giả sử sử dụng Numpy, đây là câu trả lời]. Mã numpy nào có thể tạo thành some_function[]
bên dưới để thực hiện phép tính này?
>>> min_idx = [1,5,7]
>>> max_idx = [2,4,6,8]
>>> some_function[min_idx, max_idx]
[1, 2, 5, 6, 7, 8]
Trong ví dụ trên, chúng tôi đã xem danh sách *_idx
nào bắt đầu với giá trị thấp hơn và chọn nó là "đầu tiên" [min_idx
]. Từ đó, chúng tôi nhảy qua lại giữa min_idx
và
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
1 để chọn "số lớn nhất tiếp theo"- Bắt đầu với 1 từ
min_idx
- Nhìn vào
1 để tìm số chưa sử dụng đầu tiên lớn hơn 1. 2# Ensure we use alternating mins and maxes idx = [] max_bookmark = 0 if min_idx[0] < max_idx[0]: first_idx = min_idx second_idx = max_idx else: first_idx = max_idx second_idx = min_idx for i, v in enumerate[first_idx]: if not idx: # We just started, so put our 1st value in idx idx.append[v] elif v > idx[-1]: idx.append[v] else: # Go on to next value in first_idx until we're bigger than the last [max] value continue # We just added a value from first_idx, so now look for one from second_idx for j, k in enumerate[second_idx[max_bookmark:]]: if k > v: idx.append[k] max_bookmark += j + 1 break
- Quay lại
min_idx
để tìm số chưa sử dụng đầu tiên lớn hơn 2. 5 - Một lần nữa cho
1. chúng tôi bỏ qua 4 vì nó nhỏ hơn 5 và chọn 6# Ensure we use alternating mins and maxes idx = [] max_bookmark = 0 if min_idx[0] < max_idx[0]: first_idx = min_idx second_idx = max_idx else: first_idx = max_idx second_idx = min_idx for i, v in enumerate[first_idx]: if not idx: # We just started, so put our 1st value in idx idx.append[v] elif v > idx[-1]: idx.append[v] else: # Go on to next value in first_idx until we're bigger than the last [max] value continue # We just added a value from first_idx, so now look for one from second_idx for j, k in enumerate[second_idx[max_bookmark:]]: if k > v: idx.append[k] max_bookmark += j + 1 break
- tiếp tục quá trình cho đến khi chúng tôi hết giá trị trong một trong hai danh sách
Một ví dụ khác, đối với
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
1 và # Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
2, kết quả dự kiến là # Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
3Giải pháp không phải Numpy hiện tại của tôi trông như thế này trong đó
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
4 là đầu ra# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
Không giống như các câu trả lời khác về việc hợp nhất các mảng Numpy, khó khăn ở đây là so sánh các giá trị phần tử khi một lần nhảy giữa hai danh sách trên đường đi
Tiểu sử. Danh sách tối thiểu/tối đa
2 danh sách đầu vào cho vấn đề của tôi ở trên được tạo bởi
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate[first_idx]:
if not idx:
# We just started, so put our 1st value in idx
idx.append[v]
elif v > idx[-1]:
idx.append[v]
else:
# Go on to next value in first_idx until we're bigger than the last [max] value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate[second_idx[max_bookmark:]]:
if k > v:
idx.append[k]
max_bookmark += j + 1
break
5 phải được sử dụng hai lần. một lần để có chỉ số cực đại và một lần nữa để có chỉ số cực tiểu. Cuối cùng, tôi chỉ muốn một danh sách duy nhất gồm các chỉ số có giá trị tối đa và phút xen kẽ, vì vậy nếu có một hàm scipy hoặc numpy nào đó có thể tìm thấy giá trị tối đa và phút của một tập dữ liệu, đồng thời trả về danh sách các chỉ số biểu thị giá trị tối đa và phút xen kẽ, thì điều đó sẽ giải quyết được những gì tôi