For me, the two most “magical” things about np.arrays are:
- Vectorized/broadcast operations, like multiplying a matrix and a scalar value & adding or subtracting two vectors or two matrices - but also any vectorized function;
- Masking & array indexing, being able to use arrays to select positions on other arrays;
- Bonus-third-thing: multi-dimensional arrays in general are quite magical too, if you add slicing to it, good lord, it can be quite daunting.