0

I am trying to write some machine learning code in golang. I can't figure a way to have a function deal with a slice of N dimensions, as different dimensions would need to return different types. Here is an example function that splits a 2d slice into test/training sets.

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

In python I do not need to worry about the dimensions of the array. Is there a "golang" way to deal with this?

EDIT: I understand there are not generics in golang. My question was more about solutions outside of generics such as what the accepted answer has pointed to.

Ryan McCauley
  • 207
  • 1
  • 8
  • 2
    No there is not a generic way. Sorry. – Volker May 31 '18 at 12:53
  • 1
    I found this proposal document (https://go.googlesource.com/proposal/+/master/design/6282-table-data.md) which has a couple of interesting work-arounds, but **NO** there is no generic way. – Popmedic May 31 '18 at 13:00
  • Thank you, this article is by a developer from gonum which is a golang flavour of numpy so exactly what I'm looking for. – Ryan McCauley May 31 '18 at 13:05

1 Answers1

1

See for example how gorgonia.org/tensor does it: a "dense" multi-dimensional array.

The concept is simple, define a type like:

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

Where Dimensions holds the n dimensions of the n-dimensional array and Values is a linear storage for the values. The invariant is that the product over all Dimensions is the length of Values. You can access different dimensions using simple O(1) arithmetic. A Tensor of dimension zero (empty Dimensions slice) is a single value.

The package mentioned above already does all this.

thwd
  • 23,956
  • 8
  • 74
  • 108