I believe we are converging, and this is pretty much the same design as I advocated. It is similar to boost::ublas.
Storage is one concept.
Interpretation of the storage is another concept.
Numpy is a combination of a storage and interpretation.
Storage could be dense or sparse. Allocated in various ways. Sparse can be implemented in different ways.
Interpretation can be 1-d, 2-d. Zero-based, non-zero based. Also there is question of ownership (slices).