Перевести функцию оцифровки numpy в c#

#python #c# #translate #indices #binning

#python #c# #перевести #индексы #биннинг

Вопрос:

Функция оцифровки возвращает индексы ячеек, к которым принадлежит каждое значение во входном массиве.

Приведенный ниже код взят из python —

 x = np.array([0.8, 6.9, 3.5, 1.9])
bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])
inds = np.digitize(x, bins)
print(inds)
array([1, 4, 3, 2])
 

Как я могу добиться того же результата, используя C #?

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

1. Как насчет того, чтобы объяснить своими словами, что она делает (точно), привести пример вывода и показать нам, что вы пробовали.

2. @TheGeneral: Я думаю, мы оба знаем, что этого не произойдет!

3. @MitchWheat да, я, возможно, был немного оптимистичен 🙂

4.Эта документация, по-видимому, объясняет, что digitize следует делать: для каждого элемента в x этот метод возвращает индекс i для ячейки, в которую попадает значение массива. Индекс — это место, где значение x соответствует одному из следующих условий: bins[i-1] < x <= bins[i] или bins[i-1] >= x > bins[i] (в зависимости от того, увеличиваются или уменьшаются значения ячеек). Вам просто нужно написать код, который делает это на C #.

5. Используйте IronPython и импортируйте его.

Ответ №1:

Может быть

 public static IEnumerable<int> Digitize(double[] input, double[] source)
{
   foreach (var item in input)
      for (var index = 0; index < source.Length-1; index  )
         if (item > source[index] amp;amp; item < source[index 1])
         {
            yield return index;
            break;
         }
}
 

Тест

 var input = new [] { 0.2, 6.4, 3.0, 1.6 };
var bins = new[] { 0.0, 1.0, 2.5, 4.0, 10.0 };

var results = Digitize(input, bins);

Console.WriteLine(string.Join(", ", results));
 

Вывод

 0, 3, 2, 1
 

Ответ №2:

Вы можете написать свою собственную функцию оцифровки, которая принимает два массива в качестве параметров.

 using System;

public class Test
{       
    static int findBinIndex(double input, double[] bins) {
        for(int i=1; i<bins.Length; i  ){
           if(input < bins[i]) {
              return i;
           }
        }
        return bins.Length;
    }

    static void digitize(double[] x, double[] bins) {
        for(int i=0;i<x.Length;i  ){
            System.Console.WriteLine(findBinIndex(x[i], bins));
        }
    }
    public static void Main()
    {
        double[] x = new double[] {0.8, 6.9, 3.5, 1.9};
        double[] bins = new double[] {0.0, 1.0, 2.5, 4.0, 10.0};
        digitize(x, bins);
    }
}
 

Вы также можете использовать Array.Функция двоичного поиска для увеличения времени выполнения.