Добавление ограничений в условный запрос / операцию в Mathematica

#wolfram-mathematica #conditional #average #threshold

#wolfram-mathematica #условные операторы #среднее #пороговое значение

Вопрос:

Я использую следующую функцию для выполнения условной операции над списком:

 consider[data_, conditionCOL_, conditionVAL_, listOfCol_] :=
  Select[data, (#[[conditionCOL]] == conditionVAL) amp;][[All, listOfCol]]
  

Рассматривая следующий пример :

 dalist = Join[Tuples[Range[4], 2][Transpose], {Range[16], Range[17, 32, 1]}
         ][Transpose];
  

введите описание изображения здесь

Я использую следующее для получения средних значений конкретных столбцов, определенных функцией.
Это выведет средние значения записей в столбцах 3 и 4, для которых соответствующая запись в столбце 1 равна 2

 Mean@consider[dalist, 1, 2, {3, 4}]
  

введите описание изображения здесь

Теперь я хотел бы добавить ограничения / пороговые значения для значений, подлежащих усреднению :

Усредняйте значения, когда они:

  • Выше минимального значения (например, 3)
  • При максимальном значении (например, 25)

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

введите описание изображения здесь

Комментарии:

1. Кстати, в вашем исходном коде только Select оператор возвращает именно то, что вы ищете, поскольку MapThread[{#1, #2}amp;, ...] и Transpose являются точными обратными друг другу.

2. @rcollyer, спасибо, я адаптировал это из следующего, и, подавляя # 3, я не думал об избыточности! MapThread[Диск[{#1, #2}, #3] amp;, Транспонировать@ Partition[ Сгладить@Union[ Выбрать[t4dataLAEH10, (#[[9]] == disp) amp;][[Все, 54 ;; 77]]], 3]]

3. предположим, вам нужны только первые 4 точки, т. е. {conditionCOL, conditionVAL}={1,1} . Какое отфильтрованное среднее значение вы ожидали бы от этого? Есть два способа интерпретировать это: оба столбца должны соответствовать критериям фильтрации, что дает среднее значение {4,20} , или каждый столбец фильтруется независимо, что дает среднее значение {4, 37/2} . Текущие ответы дают первый результат, в то время как я подозреваю, что вы хотите последнего.

Ответ №1:

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

 filter[data : {{_, _} ..}, {min_, max_}] := 
   Select[data, min < #[[1]] < max amp;amp; min < #[[2]] < max amp;]

dataWithinLimitsQ[data : {{_, _} ..}, {min_, max_}] := 
   data == filter[data, {min, max}]

meanFiltered[data : {{_, _} ..}, {min_, max_}] := 
   Mean@filter[data, {min, max}]
  

Вот как вы можете их использовать:

 In[365]:= dalist=Join[Tuples[Range[4],2][Transpose],{Range[16],Range[17,32,1]}][Transpose]
Out[365]= {{1,1,1,17},{1,2,2,18},{1,3,3,19},{1,4,4,20},{2,1,5,21},{2,2,6,22},{2,3,7,23},
{2,4,8,24},{3,1,9,25},{3,2,10,26},{3,3,11,27},{3,4,12,28},{4,1,13,29},{4,2,14,30},{4,3,15,31},
{4,4,16,32}}

In[378]:= considered = consider[dalist,1,1,{3,4}]

Out[378]= {{1,17},{2,18},{3,19},{4,20}}

In[379]:= filter[considered,{2,21}]

Out[379]= {{3,19},{4,20}}

In[380]:= dataWithinLimitsQ[considered,{2,21}]

Out[380]= False

In[381]:= meanFiltered[considered,{2,21}]

Out[381]= {7/2,39/2}
  

Комментарии:

1. @rcollyer Надеюсь, когда-нибудь мы сравняем счет 🙂 Спасибо за положительный отзыв.

2. Спасибо, Леонид, еще раз. Я оставляю немного без ответа, чтобы посмотреть, почувствуют ли другие вдохновение, но это именно то, что мне было нужно.

Ответ №2:

Я бы использовал Cases :

 inRange[data_, {min_, max_}] := Cases[data, {__?(min < # < max amp;)}, 1]
  

Эта форма также принимает данные с произвольным количеством столбцов.

 dat = {{1, 2, 0}, {6, 7, 4}, {6, 7, 7}, {4, 5, 6}, {4, 5, 3}, {9, 7, 1}, {0, 3, 7}, {6, 2, 1}}

inRange[dat, {2, 7}]

(* Out = {{4, 5, 6}, {4, 5, 3}} *)
  

Комментарии:

1. К сожалению, первые два столбца данных операционной системы фильтруются по этому шаблону, и он напрямую не допускает разные диапазоны фильтрации для последних двух столбцов. В качестве альтернативного шаблона я бы использовал {_, _, _?(min1 < # < max1amp;), _?(min2 < # < max2amp;)} .

2.@rcollyer я ожидал использовать inRange after consider . Вы предлагаете решение, которое объединяет эти функции? Кроме того, 500 запрашивал другой диапазон для каждого столбца?

3. существует некоторая двусмысленность относительно того, чего он на самом деле хотел, на данный момент он еще не ответил на мой комментарий выше. Мой nit ссылался на эту двусмысленность и не был предназначен для предложения объединить две операции. Кстати, ответ Леонида ведет себя точно так же. Кроме того, нет, он не запрашивал другой диапазон для каждого столбца, я просто был самонадеян / инициативен.