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

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

У меня есть массив, заполненный нулями, который добавляет значения каждый раз, когда выполняется условие, поэтому после 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

Любая помощь приветствуется :)

Не могли бы вы привести пример того, как вы хотите, чтобы результат выглядел?

Simon 16.08.2018 07:36

Разве использование Numba или Cython не вариант?

max9111 16.08.2018 22:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
1 836
2

Ответы 2

Я, вероятно, не понял вашу проблему здесь, но если вы хотите сначала проверить, находится ли размер пузыря между одним и тем же элементом строки 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: Расскажите, пожалуйста, на моих примерах, какой окончательный массив вы ищете?

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

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

Вы можете сделать это, используя логическую индексацию в 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]])

Другие вопросы по теме