Как загрузить большой файл CSV в ILArray для 3D-графики?

У меня есть несколько файлов в формате csv с научными данными, чтобы изучить их в 3D. Содержимое файла организовано как дата и время, частота в Гц и интенсивность в дБ, как в этом примере:

2014-03-15 18:00:00, 19700000.0, -30.19
2014-03-15 18:00:00, 19700781.25, -31.19
2014-03-15 18:00:00, 19701562.5, -30.43
2014-03-15 18:00:00, 19702343.75, -30.37
2014-03-15 18:00:00, 19703125.0, -27.06

Для контекста графика 3 значения представляют соответственно x, y, z.

Я хотел бы создать собственный тип с именем datasample, состоящий из типов datetime,float,float, а затем объявить массив как

ILArray<datasample>

Есть ли конкретная функция или предлагаемый способ загрузки из файла ILArray для построения графика?

Может ли ILNumerics правильно обрабатывать формат даты и времени первого столбца или мне нужно предварительно обработать файл, чтобы преобразовать его во что-то другое?

Спасибо за вашу поддержку

ОБНОВЛЕНО после ответа со следующим исходным кодом. Я загрузил 3,6 миллиона точек, и трехмерный график отображается плавно. Мне понадобятся некоторые инструкции о том, как раскрасить отдельные точки в зависимости от их значения Z. Кажется, что использование поверхности с миллионами точек на входе немного... тяжело :-) Какие-нибудь советы по производительности, которые я мог бы использовать?

Это скриншот: скриншот отрендеренной сцены

using ILNumerics;
using ILNumerics.Drawing;
using ILNumerics.Drawing.Plotting;

using System.IO;
using System.Globalization;

private void ilPanel1_Load(object sender, EventArgs e)
{

    fsin = new System.IO.StreamReader("testlong.iln");

    while(fsin.EndOfStream == false)
    {
        datarow = fsin.ReadLine();
        // Console.WriteLine(datarow);

        rowvalues = datarow.Split(',');
        inrows = inrows + 1;

        tempX.Add(float.Parse(rowvalues[0], CultureInfo.InvariantCulture));
        tempY.Add(float.Parse(rowvalues[1], CultureInfo.InvariantCulture));
        tempZ.Add(float.Parse(rowvalues[2], CultureInfo.InvariantCulture));

    }
    fsin.Close();

    // now that I know the input size (number of x,y,z tuples), I can 
    // create and initialize the ILArray :
    ILArray<float> datasamples = ILMath.zeros<float>(3, (int)inrows );

    label1.Text = String.Format("Data points read: {0:N0}", inrows);

    // ... and now I can copy data from the input arrays:
    datasamples["0;:"] = tempX.ToArray();
    datasamples["1;:"] = tempY.ToArray();
    datasamples["2;:"] = tempZ.ToArray();

    // these are no longer used so...
    tempX.Clear();
    tempY.Clear();
    tempZ.Clear();

    var scene = new ILScene {
        new ILPlotCube(twoDMode: false) {
            new ILPoints {
                Positions = datasamples,
                Color = Color.Blue,
                // Colors = 
                Size = 0.5F
            }
        }
    };

    // at the end of all modifications, call Configure()
    ilPanel1.Scene = scene;
    ilPanel1.Scene.Configure();
    ilPanel1.Refresh();
}

person MarioCannistra    schedule 19.03.2014    source источник


Ответы (1)


Данные CSV считываются с помощью ILMath.csvread<T>(). Функция позволяет указать общий тип элемента с помощью универсального параметра:

string s =
@"2014-03-15 18:00:00, 19700000.0, -30.19
2014-03-15 18:00:00, 19700781.25, -31.19
2014-03-15 18:00:00, 19701562.5, -30.43
2014-03-15 18:00:00, 19702343.75, -30.37
2014-03-15 18:00:00, 19703125.0, -27.06";

ILArray<double> A = ILMath.csvread<double>(s);

>A
<Double> [5,3]
(:,:) 1e+007 *
    0,00000    1,97000    0,00000
    0,00000    1,97008    0,00000
    0,00000    1,97016    0,00000
    0,00000    1,97023    0,00000
    0,00000    1,97031    0,00000

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

Однако это порождает другие проблемы:

1) csvread() ожидает однородные элементы из файла csv. Хотя ILArray<datasample> хорош (и полезен), csvread не поддерживает его напрямую.

2) Если ваша цель - построить данные, вам все равно придется преобразовать дату и время в какое-то реальное число. Пространство имен Drawing ожидает только ILArray.

3) Кроме того, большинство функций ILMath специализированы для ILArray некоторого реального (System.Value) формата элемента. Наличие ILArray дало бы очень ограниченную поддержку с помощью этих функций.

EDIT: Как насчет этого? :)

private void ilPanel1_Load(object sender, EventArgs e) { ILArray<float> A = ILMath.tosingle(ILMath.rand(4, 3000)); ilPanel1.Scene.Add( new ILPlotCube(twoDMode:false) { new ILPoints() { Positions = A["0,1,2;:"], Colors = new ILColormap(Colormaps.Jet).Map(A["2;:"]).T, Color = null } }); } введите здесь описание изображения

person numbers303    schedule 19.03.2014
comment
Спасибо за добрый ответ. Я конвертирую дату и время в реальное, а затем попробую некоторые способы загрузки файла. Каждый из них имеет размер 122 МБ в формате csv... надеюсь, у меня все получится, и я добавлю сюда обновление. - person MarioCannistra; 19.03.2014
comment
Спасибо за обновление цвета с использованием значения Z. Это прекрасно работает. Сейчас я делаю другие тесты, чтобы увидеть, могу ли я сделать то же самое, используя поверхность вместо точек, поскольку у меня возникают странные муаровые эффекты при вращении графического куба с помощью мыши. При необходимости я открою отдельную ветку вопросов здесь, на SO. - person MarioCannistra; 21.03.2014