Brad Thompson (5-2) took Carpenter's spot and kept the Cardinals' spurt going. The right-hander went five innings and gave up three runs, including an unearned run set up by catcher Jason LaRue's bad throw and missed tag.
Rookie Chris Perez relieved with one out in the ninth and gave up a single before striking out the last two batters, completing his fourth save in five chances. Perez has helped stabilize a bullpen that leads the NL with 27 blown saves.
Arroyo (10-10) couldn't put the brakes on Cincinnati's fade. The Reds have lost 16 of 20, leaving them stranded in last place in the NL Central.
Ankiel got it going with a two-run homer in the first. The outfielder returned to the lineup last Monday after missing two weeks with strained abdominal muscles. His 23rd homer ended the long drought and put St. Louis ahead to stay.
Felipe Lopez had a single and a triple off Arroyo and scored twice. Albert Pujols had three hits, including a double that bounced off the corner of third base and flew to a fan in the stands wearing a Pujols shirt.
Thompson gave up only three hits in his fourth start of the season and his first since June 19. The right-hander also has made 16 relief appearances. The Reds scored an unearned run off Thompson with the help of two mistakes by LaRue in the fifth inning.
Corey Patterson walked, stole second and continued to third when LaRue threw the ball into center field. Patterson broke for home when Ryan Hanigan hit a grounder to third baseman Troy Glaus, whose throw home was in plenty of time to get the out.