Если «число» означает целое число, то:
a = h.each_with_object([]) { |(k, v), a| a << v if(k.to_i.to_s == k) }
Если «число» также включает значения с плавающей запятой, то:
h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) }
Например:
>> h = { '0' => 'foo', 'bar' => 'baz', '2' => 'yada', '-3.1415927' => 'pancakes' }
=> {"0"=>"foo", "bar"=>"baz", "2"=>"yada", "-3.1415927"=>"pancakes"}
>> h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) }
=> ["foo", "yada", "pancakes"]
Возможно, вы захотите настроить тест регулярных выражений так, чтобы разрешить начальные и конечные пробелы (или нет).