Так что сделать заголовок, который на самом деле объясняет то, что я хочу, сложнее, чем я думал, поэтому я объясню это.
У меня есть массив, заполненный нулями, который добавляет значения каждый раз, когда выполняется условие, поэтому после 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 для значения связанный с совпадающим числом размера пузыря во втором столбце previous_array.
в настоящее время у меня есть что-то вроде;
if bubble_size in current_array[:, 0]:
do_whatever
но я не знаю, как вытащить связанный y_coord без использования цикла, что у меня хорошо получается (в массиве около 100 строк и, по крайней мере, 1000 временных шагов, поэтому я хочу сделать его максимально эффективным), но хотел бы избежать
Я включил свои мысли о цикле for (обратите внимание, что current и previous_array на самом деле current и previous_frame)
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
Любая помощь приветствуется :)
Разве использование Numba или Cython не вариант?






Я, вероятно, не понял вашу проблему здесь, но если вы хотите сначала проверить, находится ли размер пузыря между одним и тем же элементом строки 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), который содержит размеры пузырьков и координаты yprev_array.Вы можете сделать это, используя логическую индексацию в 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]])
Не могли бы вы привести пример того, как вы хотите, чтобы результат выглядел?