def get_rows_for(keys, by_position: true)
      raise unless keys.is_a?(Array)

      if by_position
        pos = keys
        @data.map { |vector| vector.at(*pos) }
      else
        # TODO: for now (2018-07-27), it is different than using
        #    get_rows_for(@index.pos(*keys))
        #    because Daru::Vector#at and Daru::Vector#[] don't handle Daru::MultiIndex the same way
        indexes = keys
        @data.map { |vec| vec[*indexes] }
      end
    end
@param keys [Array] can be an array of positions (if by_position is true) or indexes (if by_position if false)
because of coercion by Daru::Vector#at and Daru::Vector#[], can return either an Array of
values (representing a row) or an array of Vectors (that can be seen as rows)