Вы находитесь на странице: 1из 31

2/1/2015

Tentative NumPy Tutorial -

TentativeNumPyTutorial

Pleasedonothesitatetoclicktheeditbutton.YouwillneedtocreateaUserAccount
first.
Contents
1. Prerequisites
2. TheBasics
1. Anexample
2. ArrayCreation
3. PrintingArrays
4. BasicOperations
5. UniversalFunctions
6. Indexing,SlicingandIterating
3. ShapeManipulation
1. Changingtheshapeofanarray
2. Stackingtogetherdifferentarrays
3. Splittingonearrayintoseveralsmallerones
4. CopiesandViews
1. NoCopyatAll
2. VieworShallowCopy
3. DeepCopy
4. FunctionsandMethodsOverview
5. LessBasic
1. Broadcastingrules
6. Fancyindexingandindextricks
1. IndexingwithArraysofIndices
2. IndexingwithBooleanArrays
3. Theix_()function
4. Indexingwithstrings
7. LinearAlgebra
http://wiki.scipy.org/Tentative_NumPy_Tutorial

1/31

2/1/2015

Tentative NumPy Tutorial -

1. SimpleArrayOperations
2. TheMatrixClass
3. Indexing:ComparingMatricesand2DArrays
8. TricksandTips
1. "Automatic"Reshaping
2. VectorStacking
3. Histograms
9. References

Prerequisites
BeforereadingthistutorialyoushouldknowabitofPython.Ifyouwouldliketorefresh
yourmemory,takealookatthePythontutorial.
Ifyouwishtoworktheexamplesinthistutorial,youmustalsohavesomesoftware
installedonyourcomputer.Minimally:
Python
NumPy
Theseyoumayfinduseful:
ipythonisanenhancedinteractivePythonshellwhichisveryconvenientfor
exploringNumPy'sfeatures
matplotlibwillenableyoutoplotgraphics
SciPyprovidesalotofscientificroutinesthatworkontopofNumPy

TheBasics
NumPy'smainobjectisthehomogeneousmultidimensionalarray.Itisatableofelements
(usuallynumbers),allofthesametype,indexedbyatupleofpositiveintegers.InNumpy
dimensionsarecalledaxes.Thenumberofaxesisrank.
Forexample,thecoordinatesofapointin3Dspace[1, 2, 1]isanarrayofrank1,
becauseithasoneaxis.Thataxishasalengthof3.Inexamplepicturedbelow,thearray
hasrank2(itis2dimensional).Thefirstdimension(axis)hasalengthof2,thesecond
dimensionhasalengthof3.
[[1.,0.,0.],
[0.,1.,2.]]

Numpy'sarrayclassiscalledndarray.Itisalsoknownbythealiasarray.Notethat
numpy.arrayisnotthesameastheStandardPythonLibraryclassarray.array,which
onlyhandlesonedimensionalarraysandofferslessfunctionality.Themoreimportant
attributesofanndarrayobjectare:
ndarray.ndim
http://wiki.scipy.org/Tentative_NumPy_Tutorial

2/31

2/1/2015

Tentative NumPy Tutorial -

thenumberofaxes(dimensions)ofthearray.InthePythonworld,thenumberof
dimensionsisreferredtoasrank.
ndarray.shape
thedimensionsofthearray.Thisisatupleofintegersindicatingthesizeofthe
arrayineachdimension.Foramatrixwithnrowsandmcolumns,shapewillbe
(n,m).Thelengthoftheshapetupleisthereforetherank,ornumberofdimensions,
ndim.
ndarray.size
thetotalnumberofelementsofthearray.Thisisequaltotheproductofthe
elementsofshape.
ndarray.dtype
anobjectdescribingthetypeoftheelementsinthearray.Onecancreateorspecify
dtype'susingstandardPythontypes.AdditionallyNumPyprovidestypesofitsown.
numpy.int32,numpy.int16,andnumpy.float64aresomeexamples.
ndarray.itemsize
thesizeinbytesofeachelementofthearray.Forexample,anarrayofelementsof
typefloat64hasitemsize8(=64/8),whileoneoftypecomplex32hasitemsize4
(=32/8).Itisequivalenttondarray.dtype.itemsize.
ndarray.data
thebuffercontainingtheactualelementsofthearray.Normally,wewon'tneedto
usethisattributebecausewewillaccesstheelementsinanarrayusingindexing
facilities.

Anexample
>>>fromnumpyimport*
>>>a=arange(15).reshape(3,5)
>>>a
array([[0,1,2,3,4],
[5,6,7,8,9],
[10,11,12,13,14]])
>>>a.shape
(3,5)
>>>a.ndim
2
>>>a.dtype.name
'int32'
>>>a.itemsize
4
>>>a.size
15
>>>type(a)
numpy.ndarray
>>>b=array([6,7,8])
>>>b
array([6,7,8])
http://wiki.scipy.org/Tentative_NumPy_Tutorial

3/31

2/1/2015

Tentative NumPy Tutorial -

>>>type(b)
numpy.ndarray

ArrayCreation
Thereareseveralwaystocreatearrays.
Forexample,youcancreateanarrayfromaregularPythonlistortupleusingthearray
function.Thetypeoftheresultingarrayisdeducedfromthetypeoftheelementsinthe
sequences.
>>>fromnumpyimport*
>>>a=array([2,3,4])
>>>a
array([2,3,4])
>>>a.dtype
dtype('int32')
>>>b=array([1.2,3.5,5.1])
>>>b.dtype
dtype('float64')

Afrequenterrorconsistsincallingarraywithmultiplenumericarguments,ratherthan
providingasinglelistofnumbersasanargument.
>>>a=array(1,2,3,4)#WRONG
>>>a=array([1,2,3,4])#RIGHT
arraytransformssequencesofsequencesintotwodimensionalarrays,sequencesof

sequencesofsequencesintothreedimensionalarrays,andsoon.
>>>b=array([(1.5,2,3),(4,5,6)])
>>>b
array([[1.5,2.,3.],
[4.,5.,6.]])

Thetypeofthearraycanalsobeexplicitlyspecifiedatcreationtime:
>>>c=array([[1,2],[3,4]],dtype=complex)
>>>c
array([[1.+0.j,2.+0.j],
[3.+0.j,4.+0.j]])

Often,theelementsofanarrayareoriginallyunknown,butitssizeisknown.Hence,
NumPyoffersseveralfunctionstocreatearrayswithinitialplaceholdercontent.These
minimizethenecessityofgrowingarrays,anexpensiveoperation.
http://wiki.scipy.org/Tentative_NumPy_Tutorial

4/31

2/1/2015

Tentative NumPy Tutorial -

Thefunctionzeroscreatesanarrayfullofzeros,thefunctiononescreatesanarrayfullof
ones,andthefunctionemptycreatesanarraywhoseinitialcontentisrandomanddepends
onthestateofthememory.Bydefault,thedtypeofthecreatedarrayisfloat64.
>>>zeros((3,4))
array([[0.,0.,0.,0.],
[0.,0.,0.,0.],
[0.,0.,0.,0.]])
>>>ones((2,3,4),dtype=int16)#dtypecanalsobe
specified
array([[[1,1,1,1],
[1,1,1,1],
[1,1,1,1]],
[[1,1,1,1],
[1,1,1,1],
[1,1,1,1]]],dtype=int16)
>>>empty((2,3))
array([[3.73603959e262,6.02658058e154,6.55490914e260],
[5.30498948e313,3.14673309e307,1.00000000e+000]])

Tocreatesequencesofnumbers,NumPyprovidesafunctionanalogoustorangethat
returnsarraysinsteadoflists
>>>arange(10,30,5)
array([10,15,20,25])
>>>arange(0,2,0.3)#itacceptsfloatarguments
array([0.,0.3,0.6,0.9,1.2,1.5,1.8])

Whenarangeisusedwithfloatingpointarguments,itisgenerallynotpossibletopredict
thenumberofelementsobtained,duetothefinitefloatingpointprecision.Forthisreason,
itisusuallybettertousethefunctionlinspacethatreceivesasanargumentthenumber
ofelementsthatwewant,insteadofthestep:
>>>linspace(0,2,9)#9numbersfrom0to2
array([0.,0.25,0.5,0.75,1.,1.25,1.5,1.75,2.
])
>>>x=linspace(0,2*pi,100)#usefultoevaluate
functionatlotsofpoints
>>>f=sin(x)

Seealso
array,zeros,zeros_like,ones,ones_like,empty,empty_like,arange,linspace,rand,
randn,fromfunction,fromfile

PrintingArrays
http://wiki.scipy.org/Tentative_NumPy_Tutorial

5/31

2/1/2015

Tentative NumPy Tutorial -

Whenyouprintanarray,NumPydisplaysitinasimilarwaytonestedlists,butwiththe
followinglayout:
thelastaxisisprintedfromlefttoright,
thesecondtolastisprintedfromtoptobottom,
therestarealsoprintedfromtoptobottom,witheachsliceseparatedfromthenext
byanemptyline.
Onedimensionalarraysarethenprintedasrows,bidimensionalsasmatricesand
tridimensionalsaslistsofmatrices.
>>>a=arange(6)#1darray
>>>printa
[012345]
>>>
>>>b=arange(12).reshape(4,3)#2darray
>>>printb
[[012]
[345]
[678]
[91011]]
>>>
>>>c=arange(24).reshape(2,3,4)#3darray
>>>printc
[[[0123]
[4567]
[891011]]
[[12131415]
[16171819]
[20212223]]]

Seebelowtogetmoredetailsonreshape.
Ifanarrayistoolargetobeprinted,NumPyautomaticallyskipsthecentralpartofthe
arrayandonlyprintsthecorners:
>>>printarange(10000)
[012...,999799989999]
>>>
>>>printarange(10000).reshape(100,100)
[[012...,979899]
[100101102...,197198199]
[200201202...,297298299]
...,
[970097019702...,979797989799]
[980098019802...,989798989899]
[990099019902...,999799989999]]
http://wiki.scipy.org/Tentative_NumPy_Tutorial

6/31

2/1/2015

Tentative NumPy Tutorial -

TodisablethisbehaviourandforceNumPytoprinttheentirearray,youcanchangethe
printingoptionsusingset_printoptions.
>>>set_printoptions(threshold='nan')

BasicOperations
Arithmeticoperatorsonarraysapplyelementwise.Anewarrayiscreatedandfilledwith
theresult.
>>>a=array([20,30,40,50])
>>>b=arange(4)
>>>b
array([0,1,2,3])
>>>c=ab
>>>c
array([20,29,38,47])
>>>b**2
array([0,1,4,9])
>>>10*sin(a)
array([9.12945251,9.88031624,7.4511316,2.62374854])
>>>a<35
array([True,True,False,False],dtype=bool)

Unlikeinmanymatrixlanguages,theproductoperator*operateselementwiseinNumPy
arrays.Thematrixproductcanbeperformedusingthedotfunctionorcreatingmatrix
objects(seematrixsectionofthistutorial).
>>>A=array([[1,1],
...[0,1]])
>>>B=array([[2,0],
...[3,4]])
>>>A*B#elementwiseproduct
array([[2,0],
[0,4]])
>>>dot(A,B)#matrixproduct
array([[5,4],
[3,4]])

Someoperations,suchas+=and*=,actinplacetomodifyanexistingarrayratherthan
createanewone.
>>>a=ones((2,3),dtype=int)
>>>b=random.random((2,3))
>>>a*=3
http://wiki.scipy.org/Tentative_NumPy_Tutorial

7/31

2/1/2015

Tentative NumPy Tutorial -

>>>a
array([[3,3,3],
[3,3,3]])
>>>b+=a
>>>b
array([[3.69092703,3.8324276,3.0114541],
[3.18679111,3.3039349,3.37600289]])
>>>a+=b#bisconvertedto
integertype
>>>a
array([[6,6,6],
[6,6,6]])

Whenoperatingwitharraysofdifferenttypes,thetypeoftheresultingarraycorresponds
tothemoregeneralorpreciseone(abehaviorknownasupcasting).
>>>a=ones(3,dtype=int32)
>>>b=linspace(0,pi,3)
>>>b.dtype.name
'float64'
>>>c=a+b
>>>c
array([1.,2.57079633,4.14159265])
>>>c.dtype.name
'float64'
>>>d=exp(c*1j)
>>>d
array([0.54030231+0.84147098j,0.84147098+0.54030231j,
0.540302310.84147098j])
>>>d.dtype.name
'complex128'

Manyunaryoperations,suchascomputingthesumofalltheelementsinthearray,are
implementedasmethodsofthendarrayclass.
>>>a=random.random((2,3))
>>>a
array([[0.6903007,0.39168346,0.16524769],
[0.48819875,0.77188505,0.94792155]])
>>>a.sum()
3.4552372100521485
>>>a.min()
0.16524768654743593
>>>a.max()
0.9479215542670073

Bydefault,theseoperationsapplytothearrayasthoughitwerealistofnumbers,
http://wiki.scipy.org/Tentative_NumPy_Tutorial

8/31

2/1/2015

Tentative NumPy Tutorial -

regardlessofitsshape.However,byspecifyingtheaxisparameteryoucanapplyan
operationalongthespecifiedaxisofanarray:
>>>b=arange(12).reshape(3,4)
>>>b
array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
>>>
>>>b.sum(axis=0)#sumofeachcolumn
array([12,15,18,21])
>>>
>>>b.min(axis=1)#minofeachrow
array([0,4,8])
>>>
>>>b.cumsum(axis=1)#cumulativesumalong
eachrow
array([[0,1,3,6],
[4,9,15,22],
[8,17,27,38]])

UniversalFunctions
NumPyprovidesfamiliarmathematicalfunctionssuchassin,cos,andexp.InNumPy,
thesearecalled"universalfunctions"(ufunc).WithinNumPy,thesefunctionsoperate
elementwiseonanarray,producinganarrayasoutput.
>>>B=arange(3)
>>>B
array([0,1,2])
>>>exp(B)
array([1.,2.71828183,7.3890561])
>>>sqrt(B)
array([0.,1.,1.41421356])
>>>C=array([2.,1.,4.])
>>>add(B,C)
array([2.,0.,6.])

Seealso
all,alltrue,any,applyalongaxis,argmax,argmin,argsort,average,bincount,ceil,
clip,conj,conjugate,corrcoef,cov,cross,cumprod,cumsum,diff,dot,floor,inner,
inv,lexsort,max,maximum,mean,median,min,minimum,nonzero,outer,prod,
re,round,sometrue,sort,std,sum,trace,transpose,var,vdot,vectorize,where

Indexing,SlicingandIterating
http://wiki.scipy.org/Tentative_NumPy_Tutorial

9/31

2/1/2015

Tentative NumPy Tutorial -

Onedimensionalarrayscanbeindexed,slicedanditeratedover,muchlikelistsand
otherPythonsequences.
>>>a=arange(10)**3
>>>a
array([0,1,8,27,64,125,216,343,512,729])
>>>a[2]
8
>>>a[2:5]
array([8,27,64])
>>>a[:6:2]=1000#equivalenttoa[0:6:2]=1000fromstart
toposition6,exclusive,setevery2ndelementto1000
>>>a
array([1000,1,1000,27,1000,125,216,343,
512,729])
>>>a[::1]#reverseda
array([729,512,343,216,125,1000,27,1000,
1,1000])
>>>foriina:
...printi**(1/3.),
...
nan1.0nan3.0nan5.06.07.08.09.0

Multidimensionalarrayscanhaveoneindexperaxis.Theseindicesaregiveninatuple
separatedbycommas:
>>>deff(x,y):
...return10*x+y
...
>>>b=fromfunction(f,(5,4),dtype=int)
>>>b
array([[0,1,2,3],
[10,11,12,13],
[20,21,22,23],
[30,31,32,33],
[40,41,42,43]])
>>>b[2,3]
23
>>>b[0:5,1]#eachrowinthesecondcolumn
ofb
array([1,11,21,31,41])
>>>b[:,1]#equivalenttotheprevious
example
array([1,11,21,31,41])
>>>b[1:3,:]#eachcolumninthesecondand
thirdrowofb
array([[10,11,12,13],
http://wiki.scipy.org/Tentative_NumPy_Tutorial

10/31

2/1/2015

Tentative NumPy Tutorial -

[20,21,22,23]])

Whenfewerindicesareprovidedthanthenumberofaxes,themissingindicesare
consideredcompleteslices:
>>>b[1]#thelastrow.
Equivalenttob[1,:]
array([40,41,42,43])

Theexpressionwithinbracketsinb[i]istreatedasanifollowedbyasmanyinstancesof
:asneededtorepresenttheremainingaxes.NumPyalsoallowsyoutowritethisusing
dotsasb[i,...].
Thedots(...)representasmanycolonsasneededtoproduceacompleteindexingtuple.
Forexample,ifxisarank5array(i.e.,ithas5axes),then
x[1,2,...]isequivalenttox[1,2,:,:,:],
x[...,3]tox[:,:,:,:,3]and
x[4,...,5,:]tox[4,:,:,5,:].

>>>c=array([[[0,1,2],#a3Darray(two
stacked2Darrays)
...[10,12,13]],
...
...[[100,101,102],
...[110,112,113]]])
>>>c.shape
(2,2,3)
>>>c[1,...]#sameasc[1,:,:]or
c[1]
array([[100,101,102],
[110,112,113]])
>>>c[...,2]#sameasc[:,:,2]
array([[2,13],
[102,113]])

Iteratingovermultidimensionalarraysisdonewithrespecttothefirstaxis:
>>>forrowinb:
...printrow
...
[0123]
[10111213]
[20212223]
[30313233]
[40414243]
http://wiki.scipy.org/Tentative_NumPy_Tutorial

11/31

2/1/2015

Tentative NumPy Tutorial -

However,ifonewantstoperformanoperationoneachelementinthearray,onecanuse
theflatattributewhichisaniteratoroveralltheelementsofthearray:
>>>forelementinb.flat:
...printelement,
...
012310111213202122233031323340414243

Seealso
[],...,newaxis,ndenumerate,indices,indexexp

ShapeManipulation
Changingtheshapeofanarray
Anarrayhasashapegivenbythenumberofelementsalongeachaxis:
>>>a=floor(10*random.random((3,4)))
>>>a
array([[7.,5.,9.,3.],
[7.,2.,7.,8.],
[6.,8.,3.,2.]])
>>>a.shape
(3,4)

Theshapeofanarraycanbechangedwithvariouscommands:
>>>a.ravel()#flattenthearray
array([7.,5.,9.,3.,7.,2.,7.,8.,6.,8.,3.,2.])
>>>a.shape=(6,2)
>>>a.transpose()
array([[7.,9.,7.,7.,6.,3.],
[5.,3.,2.,8.,8.,2.]])

Theorderoftheelementsinthearrayresultingfromravel()isnormally"Cstyle",thatis,
therightmostindex"changesthefastest",sotheelementaftera[0,0]isa[0,1].Ifthearray
isreshapedtosomeothershape,againthearrayistreatedas"Cstyle".Numpynormally
createsarraysstoredinthisorder,soravel()willusuallynotneedtocopyitsargument,
butifthearraywasmadebytakingslicesofanotherarrayorcreatedwithunusual
options,itmayneedtobecopied.Thefunctionsravel()andreshape()canalsobe
instructed,usinganoptionalargument,touseFORTRANstylearrays,inwhichthe
leftmostindexchangesthefastest.
Thereshapefunctionreturnsitsargumentwithamodifiedshape,whereastheresize
methodmodifiesthearrayitself:
http://wiki.scipy.org/Tentative_NumPy_Tutorial

12/31

2/1/2015

Tentative NumPy Tutorial -

>>>a
array([[7.,5.],
[9.,3.],
[7.,2.],
[7.,8.],
[6.,8.],
[3.,2.]])
>>>a.resize((2,6))
>>>a
array([[7.,5.,9.,3.,7.,2.],
[7.,8.,6.,8.,3.,2.]])

Ifadimensionisgivenas1inareshapingoperation,theotherdimensionsare
automaticallycalculated:
>>>a.reshape(3,1)
array([[7.,5.,9.,3.],
[7.,2.,7.,8.],
[6.,8.,3.,2.]])

Seealso::shapeexample,reshapeexample,resizeexample,ravelexample

Stackingtogetherdifferentarrays
Severalarrayscanbestackedtogetheralongdifferentaxes:
>>>a=floor(10*random.random((2,2)))
>>>a
array([[1.,1.],
[5.,8.]])
>>>b=floor(10*random.random((2,2)))
>>>b
array([[3.,3.],
[6.,0.]])
>>>vstack((a,b))
array([[1.,1.],
[5.,8.],
[3.,3.],
[6.,0.]])
>>>hstack((a,b))
array([[1.,1.,3.,3.],
[5.,8.,6.,0.]])

Thefunctioncolumn_stackstacks1Darraysascolumnsintoa2Darray.Itisequivalent
tovstackonlyfor1Darrays:
http://wiki.scipy.org/Tentative_NumPy_Tutorial

13/31

2/1/2015

Tentative NumPy Tutorial -

>>>column_stack((a,b))#With2Darrays
array([[1.,1.,3.,3.],
[5.,8.,6.,0.]])
>>>a=array([4.,2.])
>>>b=array([2.,8.])
>>>a[:,newaxis]#Thisallowstohavea2Dcolumnsvector
array([[4.],
[2.]])
>>>column_stack((a[:,newaxis],b[:,newaxis]))
array([[4.,2.],
[2.,8.]])
>>>vstack((a[:,newaxis],b[:,newaxis]))#Thebehaviorofvstackis
different
array([[4.],
[2.],
[2.],
[8.]])

Thefunctionrow_stack,ontheotherhand,stacks1Darraysasrowsintoa2Darray.
Forarraysofwithmorethantwodimensions,hstackstacksalongtheirsecondaxes,
vstackstacksalongtheirfirstaxes,andconcatenateallowsforanoptionalarguments
givingthenumberoftheaxisalongwhichtheconcatenationshouldhappen.
Note
Incomplexcases,r_[]andc_[]areusefulforcreatingarraysbystackingnumbersalong
oneaxis.Theyallowtheuseofrangeliterals(":"):
>>>r_[1:4,0,4]
array([1,2,3,0,4])

Whenusedwitharraysasarguments,r_[]andc_[]aresimilartovstackandhstackintheir
defaultbehavior,butallowforanoptionalargumentgivingthenumberoftheaxisalong
whichtoconcatenate.
Seealso:hstackexample,vstackexammple,column_stackexample,row_stackexample,
concatenateexample,c_example,r_example

Splittingonearrayintoseveralsmallerones
Usinghsplit,youcansplitanarrayalongitshorizontalaxis,eitherbyspecifyingthe
numberofequallyshapedarraystoreturn,orbyspecifyingthecolumnsafterwhichthe
divisionshouldoccur:
>>>a=floor(10*random.random((2,12)))
>>>a
array([[8.,8.,3.,9.,0.,4.,3.,0.,0.,6.,4.,4.],
[0.,3.,2.,9.,6.,0.,4.,5.,7.,5.,1.,
http://wiki.scipy.org/Tentative_NumPy_Tutorial

14/31

2/1/2015

Tentative NumPy Tutorial -

4.]])
>>>hsplit(a,3)#Splitainto3
[array([[8.,8.,3.,9.],
[0.,3.,2.,9.]]),array([[0.,4.,3.,0.],
[6.,0.,4.,5.]]),array([[0.,6.,4.,4.],
[7.,5.,1.,4.]])]
>>>hsplit(a,(3,4))#Splitaafterthethirdandthefourth
column
[array([[8.,8.,3.],
[0.,3.,2.]]),array([[9.],
[9.]]),array([[0.,4.,3.,0.,0.,6.,4.,4.],
[6.,0.,4.,5.,7.,5.,1.,4.]])]

vsplitsplitsalongtheverticalaxis,andarraysplitallowsonetospecifyalongwhichaxis
tosplit.

CopiesandViews
Whenoperatingandmanipulatingarrays,theirdataissometimescopiedintoanewarray
andsometimesnot.Thisisoftenasourceofconfusionforbeginners.Therearethree
cases:

NoCopyatAll
Simpleassignmentsmakenocopyofarrayobjectsoroftheirdata.
>>>a=arange(12)
>>>b=a#nonewobjectiscreated
>>>bisa#aandbaretwonamesforthesamendarray
object
True
>>>b.shape=3,4#changestheshapeofa
>>>a.shape
(3,4)

Pythonpassesmutableobjectsasreferences,sofunctioncallsmakenocopy.
>>>deff(x):
...printid(x)
...
>>>id(a)#idisauniqueidentifierof
anobject
148293216
>>>f(a)
148293216

http://wiki.scipy.org/Tentative_NumPy_Tutorial

15/31

2/1/2015

Tentative NumPy Tutorial -

VieworShallowCopy
Differentarrayobjectscansharethesamedata.Theviewmethodcreatesanewarray
objectthatlooksatthesamedata.
>>>c=a.view()
>>>cisa
False
>>>c.baseisa#cisaviewofthedata
ownedbya
True
>>>c.flags.owndata
False
>>>
>>>c.shape=2,6#a'sshapedoesn'tchange
>>>a.shape
(3,4)
>>>c[0,4]=1234#a'sdatachanges
>>>a
array([[0,1,2,3],
[1234,5,6,7],
[8,9,10,11]])

Slicinganarrayreturnsaviewofit:
>>>s=a[:,1:3]#spacesaddedforclaritycouldalsobe
written"s=a[:,1:3]"
>>>s[:]=10#s[:]isaviewofs.Notethedifference
betweens=10ands[:]=10
>>>a
array([[0,10,10,3],
[1234,10,10,7],
[8,10,10,11]])

DeepCopy
Thecopymethodmakesacompletecopyofthearrayanditsdata.
>>>d=a.copy()#anewarrayobjectwith
newdataiscreated
>>>disa
False
>>>d.baseisa#ddoesn'tshareanything
witha
False
>>>d[0,0]=9999
http://wiki.scipy.org/Tentative_NumPy_Tutorial

16/31

2/1/2015

Tentative NumPy Tutorial -

>>>a
array([[0,10,10,3],
[1234,10,10,7],
[8,10,10,11]])

FunctionsandMethodsOverview
HereisalistofNumPyfunctionsandmethodsnamesorderedinsomecategories.The
nameslinktotheNumpyExampleListsothatyoucanseethefunctionsinaction.
ArrayCreation
arange,array,copy,empty,empty_like,eye,fromfile,fromfunction,identity,
linspace,logspace,mgrid,ogrid,ones,ones_like,r,zeros,zeros_like
Conversions
astype,atleast1d,atleast2d,atleast3d,mat
Manipulations
arraysplit,columnstack,concatenate,diagonal,dsplit,dstack,hsplit,hstack,item,
newaxis,ravel,repeat,reshape,resize,squeeze,swapaxes,take,transpose,vsplit,
vstack
Questions
all,any,nonzero,where
Ordering
argmax,argmin,argsort,max,min,ptp,searchsorted,sort
Operations
choose,compress,cumprod,cumsum,inner,fill,imag,prod,put,putmask,real,
sum
BasicStatistics
cov,mean,std,var
BasicLinearAlgebra
cross,dot,outer,svd,vdot

LessBasic
Broadcastingrules
Broadcastingallowsuniversalfunctionstodealinameaningfulwaywithinputsthatdo
nothaveexactlythesameshape.
Thefirstruleofbroadcastingisthatifallinputarraysdonothavethesamenumberof
dimensions,a"1"willberepeatedlyprependedtotheshapesofthesmallerarraysuntilall
thearrayshavethesamenumberofdimensions.
Thesecondruleofbroadcastingensuresthatarrayswithasizeof1alongaparticular
dimensionactasiftheyhadthesizeofthearraywiththelargestshapealongthat
dimension.Thevalueofthearrayelementisassumedtobethesamealongthatdimension
forthe"broadcast"array.
http://wiki.scipy.org/Tentative_NumPy_Tutorial

17/31

2/1/2015

Tentative NumPy Tutorial -

Afterapplicationofthebroadcastingrules,thesizesofallarraysmustmatch.More
detailscanbefoundinthisdocumentation.

Fancyindexingandindextricks
NumPyoffersmoreindexingfacilitiesthanregularPythonsequences.Inadditionto
indexingbyintegersandslices,aswesawbefore,arrayscanbeindexedbyarraysof
integersandarraysofbooleans.

IndexingwithArraysofIndices
>>>a=arange(12)**2#thefirst12square
numbers
>>>i=array([1,1,3,8,5])#anarrayofindices
>>>a[i]#theelementsofa
atthepositionsi
array([1,1,9,64,25])
>>>
>>>j=array([[3,4],[9,7]])#abidimensional
arrayofindices
>>>a[j]#thesameshapeasj
array([[9,16],
[81,49]])

Whentheindexedarrayaismultidimensional,asinglearrayofindicesreferstothefirst
dimensionofa.Thefollowingexampleshowsthisbehaviorbyconvertinganimageof
labelsintoacolorimageusingapalette.
>>>palette=array([[0,0,0],#black
...[255,0,0],#red
...[0,255,0],#green
...[0,0,255],#blue
...[255,255,255]])#white
>>>image=array([[0,1,2,0],#eachvalue
correspondstoacolorinthepalette
...[0,3,4,0]])
>>>palette[image]#the(2,4,3)color
image
array([[[0,0,0],
[255,0,0],
[0,255,0],
[0,0,0]],
[[0,0,0],
[0,0,255],
[255,255,255],
[0,0,0]]])
http://wiki.scipy.org/Tentative_NumPy_Tutorial

18/31

2/1/2015

Tentative NumPy Tutorial -

Wecanalsogiveindexesformorethanonedimension.Thearraysofindicesforeach
dimensionmusthavethesameshape.
>>>a=arange(12).reshape(3,4)
>>>a
array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11]])
>>>i=array([[0,1],#indicesforthe
firstdimofa
...[1,2]])
>>>j=array([[2,1],#indicesforthe
seconddim
...[3,3]])
>>>
>>>a[i,j]#iandjmusthave
equalshape
array([[2,5],
[7,11]])
>>>
>>>a[i,2]
array([[2,6],
[6,10]])
>>>
>>>a[:,j]#i.e.,a[:,j]
array([[[2,1],
[3,3]],
[[6,5],
[7,7]],
[[10,9],
[11,11]]])

Naturally,wecanputiandjinasequence(sayalist)andthendotheindexingwiththe
list.
>>>l=[i,j]
>>>a[l]#equivalentto
a[i,j]
array([[2,5],
[7,11]])

However,wecannotdothisbyputtingiandjintoanarray,becausethisarraywillbe
interpretedasindexingthefirstdimensionofa.
>>>s=array([i,j])
>>>a[s]#notwhatwewant
http://wiki.scipy.org/Tentative_NumPy_Tutorial

19/31

2/1/2015

Tentative NumPy Tutorial -

Traceback(mostrecentcalllast):
File"<stdin>",line1,in?
IndexError:index(3)outofrange(0<=index<=2)indimension0
>>>
>>>a[tuple(s)]#sameasa[i,j]
array([[2,5],
[7,11]])

Anothercommonuseofindexingwitharraysisthesearchofthemaximumvalueoftime
dependentseries:
>>>time=linspace(20,145,5)#timescale
>>>data=sin(arange(20)).reshape(5,4)#4timedependent
series
>>>time
array([20.,51.25,82.5,113.75,145.])
>>>data
array([[0.,0.84147098,0.90929743,0.14112001],
[0.7568025,0.95892427,0.2794155,0.6569866],
[0.98935825,0.41211849,0.54402111,0.99999021],
[0.53657292,0.42016704,0.99060736,0.65028784],
[0.28790332,0.96139749,0.75098725,0.14987721]])
>>>
>>>ind=data.argmax(axis=0)#indexofthe
maximaforeachseries
>>>ind
array([2,0,3,1])
>>>
>>>time_max=time[ind]#times
correspondingtothemaxima
>>>
>>>data_max=data[ind,xrange(data.shape[1])]#=>data[ind[0],0],
data[ind[1],1]...
>>>
>>>time_max
array([82.5,20.,113.75,51.25])
>>>data_max
array([0.98935825,0.84147098,0.99060736,0.6569866])
>>>
>>>all(data_max==data.max(axis=0))
True

Youcanalsouseindexingwitharraysasatargettoassignto:
>>>a=arange(5)
>>>a
array([0,1,2,3,4])
http://wiki.scipy.org/Tentative_NumPy_Tutorial

20/31

2/1/2015

Tentative NumPy Tutorial -

>>>a[[1,3,4]]=0
>>>a
array([0,0,2,0,0])

However,whenthelistofindicescontainsrepetitions,theassignmentisdoneseveral
times,leavingbehindthelastvalue:
>>>a=arange(5)
>>>a[[0,0,2]]=[1,2,3]
>>>a
array([2,1,3,3,4])

Thisisreasonableenough,butwatchoutifyouwanttousePython's+=construct,asit
maynotdowhatyouexpect:
>>>a=arange(5)
>>>a[[0,0,2]]+=1
>>>a
array([1,1,3,3,4])

Eventhough0occurstwiceinthelistofindices,the0thelementisonlyincremented
once.ThisisbecausePythonrequires"a+=1"tobeequivalentto"a=a+1".

IndexingwithBooleanArrays
Whenweindexarrayswitharraysof(integer)indicesweareprovidingthelistofindices
topick.Withbooleanindicestheapproachisdifferentweexplicitlychoosewhichitems
inthearraywewantandwhichoneswedon't.
Themostnaturalwayonecanthinkofforbooleanindexingistousebooleanarraysthat
havethesameshapeastheoriginalarray:
>>>a=arange(12).reshape(3,4)
>>>b=a>4
>>>b#bisabooleanwith
a'sshape
array([[False,False,False,False],
[False,True,True,True],
[True,True,True,True]],dtype=bool)
>>>a[b]#1darraywiththe
selectedelements
array([5,6,7,8,9,10,11])

Thispropertycanbeveryusefulinassignments:
>>>a[b]=0#Allelementsof'a'
higherthan4become0
http://wiki.scipy.org/Tentative_NumPy_Tutorial

21/31

2/1/2015

Tentative NumPy Tutorial -

>>>a
array([[0,1,2,3],
[4,0,0,0],
[0,0,0,0]])

YoucanlookattheMandelbrotsetexampletoseehowtousebooleanindexingto
generateanimageoftheMandelbrotset.
Thesecondwayofindexingwithbooleansismoresimilartointegerindexingforeach
dimensionofthearraywegivea1Dbooleanarrayselectingthesliceswewant.
>>>a=arange(12).reshape(3,4)
>>>b1=array([False,True,True])#firstdimselection
>>>b2=array([True,False,True,False])#seconddimselection
>>>
>>>a[b1,:]#selectingrows
array([[4,5,6,7],
[8,9,10,11]])
>>>
>>>a[b1]#samething
array([[4,5,6,7],
[8,9,10,11]])
>>>
>>>a[:,b2]#selectingcolumns
array([[0,2],
[4,6],
[8,10]])
>>>
>>>a[b1,b2]#aweirdthingtodo
array([4,10])

Notethatthelengthofthe1Dbooleanarraymustcoincidewiththelengthofthe
dimension(oraxis)youwanttoslice.Inthepreviousexample,b1isa1rankarraywith
length3(thenumberofrowsina),andb2(oflength4)issuitabletoindexthe2ndrank
(columns)ofa.

Theix_()function
Theix_functioncanbeusedtocombinedifferentvectorssoastoobtaintheresultfor
eachnuplet.Forexample,ifyouwanttocomputeallthea+b*cforallthetripletstaken
fromeachofthevectorsa,bandc:
>>>a=array([2,3,4,5])
>>>b=array([8,5,4])
>>>c=array([5,4,6,8,3])
>>>ax,bx,cx=ix_(a,b,c)
>>>ax
array([[[2]],
http://wiki.scipy.org/Tentative_NumPy_Tutorial

22/31

2/1/2015

Tentative NumPy Tutorial -

[[3]],
[[4]],
[[5]]])
>>>bx
array([[[8],
[5],
[4]]])
>>>cx
array([[[5,4,6,8,3]]])
>>>ax.shape,bx.shape,cx.shape
((4,1,1),(1,3,1),(1,1,5))
>>>result=ax+bx*cx
>>>result
array([[[42,34,50,66,26],
[27,22,32,42,17],
[22,18,26,34,14]],
[[43,35,51,67,27],
[28,23,33,43,18],
[23,19,27,35,15]],
[[44,36,52,68,28],
[29,24,34,44,19],
[24,20,28,36,16]],
[[45,37,53,69,29],
[30,25,35,45,20],
[25,21,29,37,17]]])
>>>result[3,2,4]
17
>>>a[3]+b[2]*c[4]
17

Youcouldalsoimplementthereduceasfollows:
defufunc_reduce(ufct,*vectors):
vs=ix_(*vectors)
r=ufct.identity
forvinvs:
r=ufct(r,v)
returnr

andthenuseitas:
>>>ufunc_reduce(add,a,b,c)
array([[[15,14,16,18,13],
[12,11,13,15,10],
http://wiki.scipy.org/Tentative_NumPy_Tutorial

23/31

2/1/2015

Tentative NumPy Tutorial -

[11,10,12,14,9]],
[[16,15,17,19,14],
[13,12,14,16,11],
[12,11,13,15,10]],
[[17,16,18,20,15],
[14,13,15,17,12],
[13,12,14,16,11]],
[[18,17,19,21,16],
[15,14,16,18,13],
[14,13,15,17,12]]])

Theadvantageofthisversionofreducecomparedtothenormalufunc.reduceisthatit
makesuseoftheBroadcastingRulesinordertoavoidcreatinganargumentarraythesize
oftheoutputtimesthenumberofvectors.

Indexingwithstrings
SeeRecordArrays.

LinearAlgebra
Workinprogress.Basiclinearalgebratobeincludedhere.

SimpleArrayOperations
Seelinalg.pyinnumpyfolderformore.
>>>fromnumpyimport*
>>>fromnumpy.linalgimport*
>>>a=array([[1.0,2.0],[3.0,4.0]])
>>>printa
[[1.2.]
[3.4.]]
>>>a.transpose()
array([[1.,3.],
[2.,4.]])
>>>inv(a)
array([[2.,1.],
[1.5,0.5]])
>>>u=eye(2)#unit2x2matrix"eye"represents"I"
>>>u
array([[1.,0.],
[0.,1.]])
http://wiki.scipy.org/Tentative_NumPy_Tutorial

24/31

2/1/2015

Tentative NumPy Tutorial -

>>>j=array([[0.0,1.0],[1.0,0.0]])
>>>dot(j,j)#matrixproduct
array([[1.,0.],
[0.,1.]])
>>>trace(u)#trace
2.0
>>>y=array([[5.],[7.]])
>>>solve(a,y)
array([[3.],
[4.]])
>>>eig(j)
(array([0.+1.j,0.1.j]),
array([[0.70710678+0.j,0.70710678+0.j],
[0.000000000.70710678j,0.00000000+0.70710678j]]))
Parameters:
squarematrix
Returns
Theeigenvalues,eachrepeatedaccordingtoitsmultiplicity.
Thenormalized(unit"length")eigenvectors,suchthatthe
column``v[:,i]``istheeigenvectorcorrespondingtothe
eigenvalue``w[i]``.

TheMatrixClass
HereisashortintrototheMatrixclass.
>>>A=matrix('1.02.03.04.0')
>>>A
[[1.2.]
[3.4.]]
>>>type(A)#filewhereclassisdefined
<class'numpy.matrixlib.defmatrix.matrix'>
>>>A.T#transpose
[[1.3.]
[2.4.]]
>>>X=matrix('5.07.0')
>>>Y=X.T
>>>Y
[[5.]
http://wiki.scipy.org/Tentative_NumPy_Tutorial

25/31

2/1/2015

Tentative NumPy Tutorial -

[7.]]
>>>printA*Y#matrixmultiplication
[[19.]
[43.]]
>>>printA.I#inverse
[[2.1.]
[1.50.5]]
>>>solve(A,Y)#solvinglinearequation
matrix([[3.],
[4.]])

Indexing:ComparingMatricesand2DArrays
NotethattherearesomeimportantdifferencesbetweenNumPyarraysandmatrices.
NumPyprovidestwofundamentalobjects:anNdimensionalarrayobjectandauniversal
functionobject.Otherobjectsarebuiltontopofthese.Inparticular,matricesare2
dimensionalarrayobjectsthatinheritfromtheNumPyarrayobject.Forbotharraysand
matrices,indicesmustconsistofapropercombinationofoneormoreofthefollowing:
integerscalars,ellipses,alistofintegersorbooleanvalues,atupleofintegersorboolean
values,anda1dimensionalarrayofintegerorbooleanvalues.Amatrixcanbeusedasan
indexformatrices,butcommonlyanarray,list,orotherformisneededtoaccomplisha
giventask.
AsusualinPython,indexingiszerobased.Traditionallywerepresenta2Darrayor
matrixasarectangulararrayofrowsandcolumns,wheremovementalongaxis0is
movementacrossrows,whilemovementalongaxis1ismovementacrosscolumns.
Let'smakeanarrayandmatrixtoslice:
>>>A=arange(12)
>>>A
array([0,1,2,3,4,5,6,7,8,9,10,11])
>>>A.shape=(3,4)
>>>M=mat(A.copy())
>>>printtype(A),"",type(M)
<type'numpy.ndarray'><class'numpy.core.defmatrix.matrix'>
>>>printA
[[0123]
[4567]
[891011]]
>>>printM
[[0123]
[4567]
[891011]]

http://wiki.scipy.org/Tentative_NumPy_Tutorial

26/31

2/1/2015

Tentative NumPy Tutorial -

Now,let'stakesomesimpleslices.Basicslicingusessliceobjectsorintegers.For
example,theevaluationofA[:]andM[:]willappearfamiliarfromPythonindexing,
howeveritisimportanttonotethatslicingNumPyarraysdoes*not*makeacopyofthe
dataslicingprovidesanewviewofthesamedata.
>>>printA[:]printA[:].shape
[[0123]
[4567]
[891011]]
(3,4)
>>>printM[:]printM[:].shape
[[0123]
[4567]
[891011]]
(3,4)

NowforsomethingthatdiffersfromPythonindexing:youmayusecommaseparated
indicestoindexalongmultipleaxesatthesametime.
>>>printA[:,1]printA[:,1].shape
[159]
(3,)
>>>printM[:,1]printM[:,1].shape
[[1]
[5]
[9]]
(3,1)

Noticethedifferenceinthelasttworesults.Useofasinglecolonforthe2Darray
producesa1dimensionalarray,whileforamatrixitproducesa2dimensionalmatrix.A
sliceofamatrixwillalwaysproduceamatrix.Forexample,asliceM[2,:]producesa
matrixofshape(1,4).Incontrast,asliceofanarraywillalwaysproduceanarrayofthe
lowestpossibledimension.Forexample,ifCwerea3dimensionalarray,C[...,1]
producesa2DarraywhileC[1,:,1]producesa1dimensionalarray.Fromthispointon,
wewillshowresultsonlyforthearraysliceiftheresultsforthecorrespondingmatrix
sliceareidentical.
Letssaythatwewantedthe1stand3rdcolumnofanarray.Onewayistosliceusinga
list:
>>>A[:,[1,3]]
array([[1,3],
[5,7],
[9,11]])

Aslightlymorecomplicatedwayistousethetake()method:

http://wiki.scipy.org/Tentative_NumPy_Tutorial

27/31

2/1/2015

Tentative NumPy Tutorial -

>>>A[:,].take([1,3],axis=1)
array([[1,3],
[5,7],
[9,11]])

Ifwewantedtoskipthefirstrow,wecoulduse:
>>>A[1:,].take([1,3],axis=1)
array([[5,7],
[9,11]])

OrwecouldsimplyuseA[1:,[1,3]].Yetanotherwaytoslicetheaboveistouseacross
product:
>>>A[ix_((1,2),(1,3))]
array([[5,7],
[9,11]])

Forthereader'sconvenience,hereisourarrayagain:
>>>printA
[[0123]
[4567]
[891011]]

Nowlet'sdosomethingabitmorecomplicated.Letssaythatwewanttoretainall
columnswherethefirstrowisgreaterthan1.Onewayistocreateabooleanindex:
>>>A[0,:]>1
array([False,False,True,True],dtype=bool)
>>>A[:,A[0,:]>1]
array([[2,3],
[6,7],
[10,11]])

Justwhatwewanted!Butindexingthematrixisnotsoconvenient.
>>>M[0,:]>1
matrix([[False,False,True,True]],dtype=bool)
>>>M[:,M[0,:]>1]
matrix([[2,3]])

Theproblemofcourseisthatslicingthematrixsliceproducedamatrix.Butmatrices
haveaconvenient'A'attributewhosevalueisthearrayrepresentation,sowecanjustdo
thisinstead:
http://wiki.scipy.org/Tentative_NumPy_Tutorial

28/31

2/1/2015

Tentative NumPy Tutorial -

>>>M[:,M.A[0,:]>1]
matrix([[2,3],
[6,7],
[10,11]])

Ifwewantedtoconditionallyslicethematrixintwodirections,wemustadjustour
strategyslightly.Insteadof
>>>A[A[:,0]>2,A[0,:]>1]
array([6,11])
>>>M[M.A[:,0]>2,M.A[0,:]>1]
matrix([[6,11]])

weneedtousethecrossproduct'ix_':
>>>A[numpy.ix_(A[:,0]>2,A[0,:]>1)]
array([[6,7],
[10,11]])
>>>M[numpy.ix_(M.A[:,0]>2,M.A[0,:]>1)]
matrix([[6,7],
[10,11]])

TricksandTips
Herewegivealistofshortandusefultips.

"Automatic"Reshaping
Tochangethedimensionsofanarray,youcanomitoneofthesizeswhichwillthenbe
deducedautomatically:
>>>a=arange(30)
>>>a.shape=2,1,3#1means"whateverisneeded"
>>>a.shape
(2,5,3)
>>>a
array([[[0,1,2],
[3,4,5],
[6,7,8],
[9,10,11],
[12,13,14]],
[[15,16,17],
[18,19,20],
[21,22,23],
[24,25,26],
http://wiki.scipy.org/Tentative_NumPy_Tutorial

29/31

2/1/2015

Tentative NumPy Tutorial -

[27,28,29]]])

VectorStacking
Howdoweconstructa2Darrayfromalistofequallysizedrowvectors?InMATLAB
thisisquiteeasy:ifxandyaretwovectorsofthesamelengthyouonlyneeddom=[x;y].
InNumPythisworksviathefunctionscolumn_stack,dstack,hstackandvstack,
dependingonthedimensioninwhichthestackingistobedone.Forexample:
x=arange(0,10,2)#x=([0,2,4,6,8])
y=arange(5)#y=([0,1,2,3,4])
m=vstack([x,y])#m=([[0,2,4,6,8],
#[0,1,2,3,4]])
xy=hstack([x,y])#xy=([0,2,4,6,8,0,1,2,3,4])

Thelogicbehindthosefunctionsinmorethantwodimensionscanbestrange.
SeealsoNumPyforMatlabUsersandaddyournewfindingsthere.

Histograms
TheNumPyhistogramfunctionappliedtoanarrayreturnsapairofvectors:the
histogramofthearrayandthevectorofbins.Beware:matplotlibalsohasafunctionto
buildhistograms(calledhist,asinMatlab)thatdiffersfromtheoneinNumPy.Themain
differenceisthatpylab.histplotsthehistogramautomatically,whilenumpy.histogram
onlygeneratesthedata.
importnumpy
importpylab
#Buildavectorof10000normaldeviateswithvariance0.5^2and
mean2
mu,sigma=2,0.5
v=numpy.random.normal(mu,sigma,10000)
#Plotanormalizedhistogramwith50bins
pylab.hist(v,bins=50,normed=1)#matplotlibversion(plot)
pylab.show()
#Computethehistogramwithnumpyandthenplotit
(n,bins)=numpy.histogram(v,bins=50,normed=True)#NumPy
version(noplot)
pylab.plot(.5*(bins[1:]+bins[:1]),n)
pylab.show()

References
ThePythontutorial.
http://wiki.scipy.org/Tentative_NumPy_Tutorial

30/31

2/1/2015

Tentative NumPy Tutorial -

TheNumpyExampleList.
ThenonexistentNumPyTutorialatscipy.org,wherewecanfindtheoldNumeric
documentation.
TheGuidetoNumPybook.
TheSciPyTutorialandaSciPycourseonline
NumPyforMatlabUsers.
Amatlab,R,IDL,NumPy/SciPydictionary.
TentativeNumPyTutorial(lastedited2012060913:21:58byArunRangarajan)

http://wiki.scipy.org/Tentative_NumPy_Tutorial

31/31

Вам также может понравиться