Числовые массивы и сравнения с разными значениями - PullRequest
0 голосов
/ 03 марта 2019

По причинам воспроизводимости, я делюсь данными здесь .

Из столбца 2 я хотел прочитать текущую строку и сравнить ее со значением предыдущей строки.Если оно больше, я продолжаю сравнивать.Если текущее значение меньше значения предыдущего ряда, я хочу разделить текущее значение (меньше) на предыдущее значение (больше).Соответственно, следующий код:

import numpy as np
import matplotlib.pyplot as plt

protocols = {}

types = {"data_c": "data_c.csv", "data_r": "data_r.csv", "data_v": "data_v.csv"}

for protname, fname in types.items():
    col_time,col_window = np.loadtxt(fname,delimiter=',').T
    trailing_window = col_window[:-1] # "past" values at a given index
    leading_window  = col_window[1:]  # "current values at a given index
    decreasing_inds = np.where(leading_window < trailing_window)[0]
    quotient = leading_window[decreasing_inds]/trailing_window[decreasing_inds]
    quotient_times = col_time[decreasing_inds]

    protocols[protname] = {
        "col_time": col_time,
        "col_window": col_window,
        "quotient_times": quotient_times,
        "quotient": quotient,
    }

data_c - это numpy.array, который имеет только одно уникальное quotient значение 0.7, как и data_r с уникальнымquotient значение 0.5.Однако data_v имеет два уникальных значения quotient (0.5 или 0.8).

Я хотел бы просмотреть значения quotient этих CSV-файлов и классифицировать их, используя простое выражение if-else.Я получаю помощь от одного участника StackOverflow, использующего numpy.array_equal следующим образом.

import numpy as np
unique_quotient = np.unique(quotient)
unique_data_c_quotient = np.r_[ 0.7]
unique_data_r_quotient = np.r_[ 0.5]

if np.array_equal( unique_quotient, unique_data_c_quotient ): 
    print('data_c')
elif np.array_equal( unique_quotient, unique_data_c_quotient ):
    print('data_r') 

Это прекрасно работает для data_c и data_r, значения которых равны 0,7 и 0,5 соответственно.Это означает, что он работает только тогда, когда значение quotient является уникальным (или фиксированным).Однако это не работает, когда значение quotient больше одного.Например, data_m имеет значения от 0,65 до 0,7 (т. Е. 0.65<=quotient<=0.7), а data_v имеет два значения quotient (0,5 и 0,8)

Как мы можем решить эту проблему, используя numpy arrays

1 Ответ

0 голосов
/ 09 марта 2019

Если у вас постоянно есть уникальные коэффициенты, и у вас постоянно есть уникальные факторные границы, то я бы порекомендовал следующее:

ud_m_bounds = np.r_[0.65,0.7]

uq = unique_quotient
uq_min,uq_max = uq.min(),uq.max()

def is_uq_bounded_by(unique_data_bounds):
  ud_min,ud_max = unique_data_bounds.min(), unique_data_bounds.max()
  left_bounded  = ud_min <= uq_min <= ud_max
  right_bounded = ud_min <= uq_max <= ud_max
  bounded = left_bounded & right_bounded
  return bounded

label = 'ERROR -- DATA UNCLASSIFIED'
if len(uq) > 2:
  if is_uq_bounded_by( unique_data_m_bounds ):
    label = 'data_m'
elif 0 < len(uq) <= 2:
  if np.array_equal( uq, unique_data_v_quotient):
    label = 'data_v' 
  if np.array_equal( uq, unique_data_c_quotient):
    label = 'data_c'
  elif np.array_equal( uq, unique_data_r_quotient):
    label = 'data_r'
print(label)

Обратите внимание, что метод становится сомнительным, когда данные начинают перекрываться.

...