goslicen-dimensional

Dealing with N-Dimensional slices in functions


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.


Solution

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