Python xen kẽ hai mảng numpy

Phương pháp #2. Sử dụng chức năng cắt danh sách Sức mạnh của việc cắt danh sách của python cũng có thể được sử dụng để thực hiện tác vụ cụ thể này. Trước tiên, chúng tôi mở rộng danh sách này sang danh sách khác và sau đó cho phép danh sách ban đầu có các chỉ số thay thế mong muốn của danh sách kết quả.  

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

# 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"

  1. Bắt đầu với 1 từ min_idx
  2. Nhìn vào
    # 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 để tìm số chưa sử dụng đầu tiên lớn hơn 1. 2
  3. Quay lại min_idx để tìm số chưa sử dụng đầu tiên lớn hơn 2. 5
  4. Một lần nữa cho
    # 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úng tôi bỏ qua 4 vì nó nhỏ hơn 5 và chọn 6
  5. 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
3

Giả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