#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.Функция двоичного поиска для увеличения времени выполнения.