Зачем нужны NumPy массивы, если в Python есть свои списки?
Тут уместна такая аналогия: вот дерево яблоня (ты ведь смыслишь в деревьях?), к нему привили черенок дерева груша. 
NumPy массивы - это не родные, но отлично привившиеся к питону обёртки над С-массивами, используемыми внутри BLAS-ядра библиотеки NumPy.
Они, эти массивы, содержат примитивные типы данных языка С - int, double и.т.д.
Питоновский лист - это массив питоновских объектов. Хоть некоторые из них и называются так же, как примитивные типы данных C (например int), они - другие. У них даже размер в памяти разный - 4 байта для C-int и от 24 байт (а для чисел свыше 2**30 - еще больше) для python-int (ссылка).
Различия этим не исчерпываются, но и этого достаточно )
ps обрати внимание на ответ Тимур Барбашов - он врёт, как сивый мерин. Реализация типа list лежит в файле с выразительным именем arraymodule.c.
Списки по своему устройству очень сильно отличаются от массивов. Учитывая, что вы дошли до NumPy, вы должны это хоть примерно представлять. Ну а NumPy предназначен для быстрой обработки данных, потому списки там ну никак не катят.