I couldn’t find a function to generate an identity matrix of a particular size in the ndarray API - am I just missing it?
My current solution is -
mx.nd.one_hot(mx.nd.arange(N), N)
Is this really the best way to do this?
Currently there’s no eye
method, beyond mxnet.nd.identity
.
Just ran a few benchmarks on this, and I think you already have the best option (staying within Python).
I tried starting with mxnet.nd.zeros
and setting the diagonal to 1, and using mxnet.nd.scatter_nd
, but both were slower in Python. You’d get much better results by dropping down into the C++ code, and setting the diagonal there.
So the way I did it is fine? Not having an eye function is strange-
Certainly does the job; and it looks quick to me. Only other avenue I can think of would be to create a sparse matrix but I agree, an eye function would be more elegant. You might want to raise a Github issue for this.
You are right, this is missing.
I wrote useful customop’s, to make a diagonal matrix from a vector and extract a diagonal from a matrix. Can point you to the code if you are interested.
@mseeger that would be great! What did you think of the kronecker product hack (another question)? Btw - this is actually really fast the way I did it
I worked on eye API in https://github.com/apache/incubator-mxnet/pull/8225. I will finish it as soon as possible. Thanks.