I disagree. Abstractions are leaky, and I think that demystifying the computer is important. You may spend more time with high level abstractions, but under that is hardware that has registers, memory, jump instructions, etc... it is not magic, and if you expect your computer to do magic, it won't work.
And what you call bottom-up approaches have value too. You talk about "how to express in numpy?", as if you were dead set on using numpy. But it numpy the right choice? It is highly optimized, sure, but is it highly optimized for your use case? A "bottom-upper" will start to think "how will I solve this problem" and then look for something that will make their task easier. It may be numpy, it may be "from scratch" or it may be something else. Ideally both approaches will lead to the same conclusion. The numpy guy may realize that his favorite library is not the right choice in the same way that the ASM guy may realize that his solution is already implemented in a library.
Anyways, a good programmer needs to have an idea of the whole spectrum, from hardware architecture to assembly to low level languages like C to high level languages like Python. Start where you want.