Значение в массиве между двумя числами в Python

1

Так что сделать заголовок, который на самом деле объясняет, что я хочу, сложнее, чем я думал, поэтому здесь я объясняю это.

У меня есть массив, заполненный нулями, который добавляет значения каждый раз, когда выполняется условие, поэтому после 1-временной итерации времени я получаю что-то вроде этого (минус заголовки):

current_array =

bubble_size y_coord
14040       42
3943        71
6345        11
0           0
0           0
....

По завершении этого этапа времени current_array устанавливается как previous_array и уничтожается нулями, потому что каждый раз не гарантируется количество записей.

ТЕПЕРЬ реальный вопрос: я хочу, чтобы иметь возможность проверять все строки в первом столбце previous_array и посмотреть, находится ли текущий размер пузыря в пределах 5% с одной стороны, и если это так, я хочу, чтобы текущая позиция y отсутствовала для значения связанный с совпадающим номером размера пузырька в предыдущем столбце предыдущей_арры.

в настоящее время у меня есть что-то вроде;

if bubble_size in current_array[:, 0]:
    do_whatever

но я не знаю, как вытащить связанный y_coord, не используя цикл, с которым я хорошо справляюсь (около 100 строк массиву и по крайней мере 1000 шагов времени, поэтому я хочу сделать его максимально эффективным), но хотелось бы избежать

Я включил свои мысли в цикл for (обратите внимание, что current и previous_array фактически являются текущими и предыдущими_фрагментами)

for y in range (0, array_size):
    if bubble_size >> previous_frame[y,0] *.95 &&<< previous_frame[y, 0] *1.05:
        distance_travelled = current_y_coord - previous_frame[y,0]
        y = y + 1

Любая помощь очень ценится :)

  • 0
    Не могли бы вы привести пример того, как вы хотите, чтобы результат выглядел?
  • 0
    Использование Numba или Cython не вариант?
Теги:
arrays
numpy
performance

2 ответа

0

Я, вероятно, не получил вашу проблему, но если вы хотите сначала проверить, находится ли размер пузыря между тем же элементом строки 95%, вы можете использовать следующее:

import numpy as np

def apply(p, c):  # For each element check the bubblesize grow
    if(p*0.95 < c < p*1.05):
        return 1
    else:
        return 0


def dist(p, c):  # Calculate the distance
    return c-p

def update(prev, cur):
    assert isinstance(
        cur, np.ndarray), 'Current array is not a valid numpy array'
    assert isinstance(
        prev, np.ndarray), 'Previous array is not a valid numpy array'
    assert prev.shape == cur.shape, 'Arrays size mismatch'

    applyvec = np.vectorize(apply)
    toapply = applyvec(prev[:, 0], cur[:, 0])

    print(toapply)

    distvec = np.vectorize(dist)
    distance = distvec(prev[:, 1], cur[:, 1])

    print(distance)


current = np.array([[14040, 42],
                [3943,71],
                [6345,11],
                [0,0],
                [0,0]])

previous = np.array([[14039, 32],
                [3942,61],
                [6344,1],
                [0,0],
                [0,0]])

update(previous,current)

PS: Пожалуйста, не могли бы вы рассказать нам, какой последний массив вы ищете на основе моих примеров?

0

Как я понимаю (поправьте меня, если я ошибаюсь):

  • У вас есть текущий размер пузырька (целое число) и текущее значение y (целое)
  • У вас есть 2D-массив (prev_array), который содержит размеры пузырьков и y-координаты
  • Вы хотите проверить, находится ли текущий размер пузыря в пределах 5% (в любом случае) каждого сохраненного размера пузырьков в prev_array
  • Если они находятся в пределах диапазона, вычтите текущее значение y из сохраненной координаты y
  • Это приведет к созданию нового массива, содержащего только размеры пузырьков, находящиеся в пределах диапазона, и вновь вычитаемое значение y
  • Вы хотите сделать это без явного цикла

Вы можете сделать это, используя boolean indexing в numpy...

Установите предыдущий массив:

prev_array = np.array([[14040, 42], [3943, 71], [6345, 11], [3945,0], [0,0]])

prev_array

array([[14040,    42],
       [ 3943,    71],
       [ 6345,    11],
       [ 3945,     0],
       [    0,     0]])

У вас есть сохраненный размер пузырька, который вы хотите использовать для сравнения, и текущее значение координаты y:

bubble_size = 3750
cur_y = 10

Затем мы можем создать булевскую маску, в которой мы выбираем только строки prev_array которые соответствуют 5% -ным критериям:

ind = (bubble_size > prev_array[:,0]*.95) & (bubble_size < prev_array[:,0]*1.05)

# ind is a boolean array that looks like this: [False,  True, False,  True, False]

Затем мы используем ind для индекса prev_array и вычисляем новые (вычитаемые) y-координаты:

new_array = prev_array[ind]
new_array[:,1] = cur_y - new_array[:,1]

Предоставление окончательного выходного массива:

array([[3943,  -61],
       [3945,   10]])

Поскольку неясно, на что вы хотите, чтобы ваш вывод действительно выглядел, вместо создания нового массива вы также можете просто обновить prev_array новыми значениями y:

ind = (bubble_size > prev_array[:,0]*.95) & (bubble_size < prev_array[:,0]*1.05)
prev_array[ind,1] = cur_y - prev_array[ind,1]

Который дает:

array([[14040,    42],
       [ 3943,   -61],
       [ 6345,    11],
       [ 3945,    10],
       [    0,     0]])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню