Is vectorization a hardware/framework specific feature or is it a good coding practice?
Vectorization can mean different things in different contexts.  In numpy we usually mean using the compiled numpy methods to work on whole arrays.  In effect it means moving any loops out of interpreted Python and into compiled code.  It's very specific to numpy.
I came to numpy from MATLAB years ago, and APL before that (and physics/math as a student).  Thus I've been used to thinking in terms of whole arrays/vectors/matrices for a long time.
MATLAB now has a lot just-in-time compiling, so programmers can write iterative code without a performance penalty.  numba (and cython) lets numpy users do some of the same, though there are still a lot of rough edges - as can be seen in numpa tagged questions.
Parallelization and other means of taking advantage of modern multi-core computers is a different topic.  That usually requires using additional packages.
I took issue with a comment that loops are not Pythonic.  I should qualify that a bit.  Python does have tools for avoiding large, hard to read loops, things like list comprehensions, generators and other comprehensions. Performing a complex task by stringing together comprehensions and generators is good Python practice, but that's not 'vectorization' (in the numpy sense).
I am trying to wrap my head around vectorization (for numerical computing), and I'm coming across seemingly contradictory explanations:

My understanding is that it is a feature built into low-level libraries that takes advantage of parallel processing capabilities of a given processor to perform operations against multiple data points simultaneously.
But several tutorials seem to be describing it as a coding practice that one incorporates into their code for more efficiency. How is it a coding practice, if it is also a feature you have or you don't have in the framework you are using. 

A more concrete explanation of my dilemma: 

Let's say I have a loop to calculate an operation on a list of numbers in Python. To vectorize it, I just import Numpy and then use an array function to do the calculation in one step instead of having to write a time consuming loop. The low level C routines used by Numpy will do all the heavy lifting on my behalf. 

Knowing about Numpy and how to import it and use it is not a coding practice, as far as I can tell. It's just good knowledge of tools and frameworks, that's all. 
So why do people keep referring to vectorization as a coding practice that good coders leverage in their code?