Well since cellular automata usually works by looking at neighboring cells a 2d array seems like an easy choice. Guess you could use a dictionary but wouldn't you need to add an entry for each cell?
Both arrays and dictionaries are rated O(1) for accessing data, which means with a key or index they can access the value with one lookup. So Big O notation doesn't help too much. Arrays are more memory efficient since it's just a list of values, whereas dictionaries store keys and values and there could be other dead space reserved depending how the dictionaries are implemented. But I imagine the speed difference is negligible, you'll hit other bottlenecks first.
Personally I'd choose the one that looks cleaner.
Arrat.at(x,y) vs Dictionary.get(x&","&y) but whatever you want to do.
All those other data objects are just arrays and dictionaries.
cvs and json are parse text data and then internally are just arrays, and a mix of arrays and dictionaries. Binary is just a 1d array of numbers.