Так что сделать заголовок, который на самом деле объясняет, что я хочу, сложнее, чем я думал, поэтому здесь я объясняю это.
У меня есть массив, заполненный нулями, который добавляет значения каждый раз, когда выполняется условие, поэтому после 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
Любая помощь очень ценится :)
Я, вероятно, не получил вашу проблему, но если вы хотите сначала проверить, находится ли размер пузыря между тем же элементом строки 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: Пожалуйста, не могли бы вы рассказать нам, какой последний массив вы ищете на основе моих примеров?
Как я понимаю (поправьте меня, если я ошибаюсь):
prev_array
), который содержит размеры пузырьков и y-координатыprev_array
Вы можете сделать это, используя 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]])