howeverthe speed comes at price using numpy arrayswe no longer have the incredible flexibility of python listswhich can hold basically anything numpy arrays always have only one datatype np array([ , , ] dtype dtype('int 'if we try to use elements of different typesnumpy will do its best to coerce them to the most reasonable common datatypenp array([ "stringy"]array([' ''stringy']dtype='| 'np array([ "stringy"set([ , , ])]array([ stringyset([ ])]dtype=objectlearning scipy on top of the efficient data structures of numpyscipy offers magnitude of algorithms working on those arrays whatever numerical-heavy algorithm you take from current books on numerical recipesyou will most likely find support for them in scipy in one way or another whether it is matrix manipulationlinear algebraoptimizationclusteringspatial operationsor even fast fourier transformationthe toolbox is readily filled thereforeit is good habit to always inspect the scipy module before you start implementing numerical algorithm for conveniencethe complete namespace of numpy is also accessible via scipy sofrom now onwe will use numpy' machinery via the scipy namespace you can check this easily by comparing the function references of any base functionfor exampleimport scipynumpy scipy version full_version scipy dot is numpy dot true the diverse algorithms are grouped into the following toolboxesscipy package cluster functionality hierarchical clustering (cluster hierarchyvector quantization -means (cluster vq