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.
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.