numpy是Python的一个科学计算模块,在numpy中,使用ndarray对象表示数组,它是整个库的核心,numpy中所有的操作都围绕ndarray对象进行处理。
ndarray 是存储单一数据类型的多维数组。
1、创建数组
首先需要创建数组,可以利用array()函数
import numpy as np
a = np.array([1,2,3])
b = np.array([[2,3,4],[3,4,5]])
print (a,b)
结果
array([1,2,3])
array([[2,3,4],[3,4,5]])
数组的形状可以通过shape属性来获得,它是一个描述数组各个轴的长度的元祖
print(a.shape,b.shape)
结果:
(3,) #有一个元素表示是一维数组,shape的元组里有几个元素就表示这个数组是几维的
(2,3)
还可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度,
b.shape = 3,2
再看b
array([[2, 3],
[4, 3],
[4, 5]])
注意从(2,3)改成(3,2)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变。
当设置某个轴的元素个数为-1时,将自动计算此轴的长度。由于数组b有6个元素,因此下面的程序将数组b的shape属性改成了(1,6):
b.shape = 6,-1
array([[2],
[3],
[4],
[3],
[4],
[5]])
使用数组的reshape()方法,可以创建指定形状的新数组,而原数组的形状保持不变
c = a.reshape((3,1))
>>> c
array([[1],
[2],
[3]])
>>> a
array([1, 2, 3])
数组a和c其实共享数据存储空间,因此修改其中任意一个数组的元素都会同时修改另一个数组的内容:
>>> a[1] = 100
>>> a
array([ 1, 100, 3])
>>> c
array([[ 1],
[100],
[ 3]])
>>>
2、元素类型
数组的元素类型可以通过dtype属性获得,我使用的是64位操作系统和Python,那么默认整数类型的长度为64位。
>>> c.dtype
dtype('int64')
可以通过dtype参数在创建数组时指定元素类型,注意float类型是64位的双精度浮点类型,而complex是128位的双精度复数类型:
>>> ai = np.array([1,2,3,4],dtype=np.int32)
>>> af = np.array([1,2,3,4],dtype=float)
>>> ac = np.array([1,2,3,4],dtype=complex)
>>> ai.dtype
dtype('int32')
>>> af.dtype
dtype('float64')
>>> ac.dtype
dtype('complex128')
使用astype()方法可以对数组的元素类型进行转换:
>>> ac.astype(np.int32)
array([1, 2, 3, 4], dtype=int32)
>>> ac.astype(np.float)
array([1., 2., 3., 4.])
3、自动生成数组
arange()类似于内置函数range(),通过指定开始值、终值和步长来创建表示等差数列的一维数组,注意所得到的结果中不包含终值。
>>> np.arange(0,1,0.1)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
linspace()通过指定开始值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。
>>> np.linspace(0,1,10)
array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
logspace()和linspace()类似,不过它所创建的数组是等比数列:
>>> np.logspace(0,2,5)
array([ 1. , 3.16227766, 10. , 31.6227766 ,
100. ])
基数可以通过base参数指定,其默认值为10
>>> np.logspace(0,1,12,base=2,endpoint=False)
array([1. , 1.05946309, 1.12246205, 1.18920712, 1.25992105,
1.33483985, 1.41421356, 1.49830708, 1.58740105, 1.68179283,
1.78179744, 1.88774863])
zeros()、ones()、empty()可以创建指定形状和类型的数组。其中empty()只分配数组所使用的内存,不对数组元素进行初始化操作,因此它的运行速度是最快的,而zeros()将数组初始化为0,ones()将数组初始化为1。
>>> np.empty((2,3),np.int)
array([[139729897318376, 22601424, 0],
[ 55834574849, 0, 139728171040769]])
>>> np.zeros((2,3),np.int)
array([[0, 0, 0],
[0, 0, 0]])
>>> np.ones((2,3),np.int)
array([[1, 1, 1],
[1, 1, 1]])
full()将数组元素初始化为指定值:
>>> np.full((2,3),np.pi)
array([[3.14159265, 3.14159265, 3.14159265],
[3.14159265, 3.14159265, 3.14159265]])
>>> np.full((2,3),12)
array([[12, 12, 12],
[12, 12, 12]])