Работа с N-мерными срезами в функциях - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь написать код машинного обучения на голанге.Я не могу придумать, как заставить функцию работать со срезом из N измерений, поскольку разные измерения должны возвращать разные типы.Вот пример функции, которая разбивает 2-мерный срез на тестовые / тренировочные наборы.

func SplitData(data [][]int, testPerc float32) ([][]int, [][]int)  {
    size := len(data)
    testSlice := int(float32(size) * testPerc)
    return data[0:testSlice], data[testSlice:]
}

В python мне не нужно беспокоиться о размерах массива.Есть ли способ «голанга» справиться с этим?

РЕДАКТИРОВАТЬ: Я понимаю, что в Голанге нет дженериков.Мой вопрос был больше о решениях вне дженериков, таких как то, на что указал принятый ответ.

1 Ответ

0 голосов
/ 31 мая 2018

Посмотрите, например, как gorgonia.org/tensor делает это: «плотный» многомерный массив.

Концепция проста, определите тип как:

type Tensor struct {
    Dimensions []int // e.g. {2, 2}
    Values     []int // e.g. {1, 2, 3, 4}
}

Где Dimensions содержит n измерений n-мерного массива, а Values - линейное хранилище для значений.Инвариант состоит в том, что произведение на все Dimensions имеет длину Values.Вы можете получить доступ к различным измерениям, используя простую арифметику O (1).Тензор нулевого измерения (пустой Dimensions slice) - это одно значение.

Упомянутый выше пакет уже делает все это.

...