Something like this should work. It uses overloading Select, which allows you to include a second input, which is the index of the element in the sequence.
var indexArray = sourceArray
.Select((value, index) => new { value, index })
.OrderByDescending(item => item.value)
.Take(1000)
.Select(item => item.index)
.ToArray();
Just project the value and index into the object, order it by value, take the top 1000 elements, and then just select the indexes before converting to an array.
Testing, taking the top 5 indices from an array { 10, 4, 6, 8, 2, 3, 5, 1, 9, 7 }, gives { 0, 8, 3, 9, 2 }which displays the values { 10, 9, 8, 7, 6 }.
, , , IndexOutOfBoundsException.
.Select(item => otherArray[item.index])
.ToArray();
, , Enumerable.Zip.