Numpy数据处理模块-数组的创建
1、数组的元素类型可以通过dtype属性命令获得:
>>> c
array([[1, 2, 3],
[2, 3, 4]])
>>> c.dtype
dtype('int32')
2、可以通过dtype参数在创建数组时指定元素类型,float是64bit的双精度浮点类型,complex是128bit的双精度复数类型。
>>> d = np.array([1,2,3],dtype=np.float)
>>> d
array([1., 2., 3.])
>>> e = np.array([1,2,3],dtype=np.complex)
>>> e
array([1.+0.j, 2.+0.j, 3.+0.j])
3、在numpy模块库中可以通过set命令来获取库中支持的完整的数据类型列表
>>> set(np.typeDict.values())
{<class 'numpy.uint16'>, <class 'numpy.complex64'>, <class 'numpy.complex128'>, <class 'numpy.timedelta64'>, <class 'numpy.int32'>, <class 'numpy.uint8'>, <class 'numpy.float64'>, <class 'numpy.void'>, <class 'numpy.int64'>, <class 'numpy.uint32'>, <class 'numpy.object_'>, <class 'numpy.int8'>, <class 'numpy.int32'>, <class 'numpy.uint64'>, <class 'numpy.int16'>, <class 'numpy.uint32'>, <class 'numpy.str_'>, <class 'numpy.datetime64'>, <class 'numpy.float32'>, <class 'numpy.bool_'>, <class 'numpy.float64'>, <class 'numpy.complex128'>, <class 'numpy.float16'>, <class 'numpy.bytes_'>}
4、通过numpy库中专用函数创建数组
(1)、arange()函数:通过指定开始值、终值(数组中不包括终值)和步长创建一维等差数列数组。
>>> a = np.arange(1,100,10)
>>> a
array([ 1, 11, 21, 31, 41, 51, 61, 71, 81, 91])
(2)、linspace()函数和arange函数功能差不多,都是创建一维等差数组,区别在于它可以指定创建数组的个数以及通过布尔类型true和false来决定数组中是否包含终值,默认为true。
>>> b = np.linspace(1,100,10,endpoint=False)
>>> b
array([ 1. , 10.9, 20.8, 30.7, 40.6, 50.5, 60.4, 70.3, 80.2, 90.1])
(3)、函数logspace(begin,end,number,base,endpoint)用于一维等比数组 ,number为数组元素个数,底数通过base参数指定默认为10,begin和end参数为幂指数,endpoint为布尔类型true和false来决定数组中是否包含终值,默认为true。
>>> c = np.logspace(0,6,6,base=2,endpoint=False)
>>> c
array([ 1., 2., 4., 8., 16., 32.])
(4)、类似函数还有zeros()、ones()、empty()等函数。
注:其中zeros()用于创建数组元素初始化为0的一维(多维)数组。
ones()用于创建数组元素初始化为1的一维(多维)数组,这两个函数功能和matlab中两个函数类似。
empty()用于分配一维(多维)数组的使用内存,但是不对数组元素进行初始化操作。以上三个函数创建的数组的元素默认数据类型都为float型。
(5)、frombuffer() fromstring() fromfile()等函数可以从字节序列或文件创建数组。
>>> s= "abcdefghjk"
>>> np.fromstring(s,dtype=np.int8)
array([ 97, 98, 99, 100, 101, 102, 103, 104, 106, 107], dtype=int8)
上述列子中是从字符串s中创建一个8bit的整数数组,所得到的数组正好就是字符串中每个字符的ASCII编码。
注:当用二进制方式在某个文件中写了一组double类型的数值,可以直接使用fromfile()从二进制文件中读取数据或者使用fromstring()读取并将其转换为float64数组。
(6)、fromfunction(func,shape)的第一个参数为计算每个数组元素的函数,第二个函数指定数组的形状,参数为一个序列。该函数可以支持多维数组。
def func2(x,y):
return (x+1)*(y+1)
a = np.fromfunction(func2,(9,9),dtype=int)
result:
[[ 1 2 3 4 5 6 7 8 9]
[ 2 4 6 8 10 12 14 16 18]
[ 3 6 9 12 15 18 21 24 27]
[ 4 8 12 16 20 24 28 32 36]
[ 5 10 15 20 25 30 35 40 45]
[ 6 12 18 24 30 36 42 48 54]
[ 7 14 21 28 35 42 49 56 63]
[ 8 16 24 32 40 48 56 64 72]
[ 9 18 27 36 45 54 63 72 81]]
5、多维数组的创建
注:Numpy中使用元组作为下标存取数组中的元素
>>> a= np.arange(0,60,10).reshape(-1,1)+np.arange(0,6)
>>> a
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
注:(1)、对一维(多维)数组可以通过切片方式进行数组元素的访问。但是在单独生成切片对象时需要使用slice(begin,end,step_len)进行创建,相应参数一次为开始值、结束值和间隔步长,无确定值时可用None替代。
(2)、也可使用numpy库中提供的s_对象来创建数组下标进行元素的访问。
>>> np.s_[::2,2::] (slice(None, None, 2), slice(2, None, None)) >> index=np.s_[::2,2::] >> a[index] array([[ 2, 3, 4, 5], [22, 23, 24, 25], [42, 43, 44, 45]])
6、结构数组
1 >>> personType = np.dtype({'names':['name', 'age', 'weight'],\
2 'formats':['S32', 'i', 'f']},align=True)#创建personType数据类型
3 #字典有两个关键字:names,formats。每个关键字对应的值都是一个列表。
4 #names定义结构中的每个字段名,而formats则定义每个字段的类型:
5 # S32 : 32个字节的字符串类型
6 # i :32bit的整数类型,相当于np.int32
7 # f :32bit的单精度浮点数类型,相当于np.float32
8 >>> personType
9 dtype([('name', 'S32'), ('age', '<i4'), ('weight', '<f4')])
10 #描述结构类型的方法: 一个包含多个组元的列表,其中形如 (字段名, 类型描述)
11 #的组元描述了结构中的每个字段。类型描述前面的 '|', '<' 等字符用来描述字段
12 #值的字节顺序:
13 # | :忽视字节顺序(在python3.5中该符号省略掉了)
14 # < : 低位字节在前
15 # > : 高位字节在前
>>> b=np.array([("zhang",32,75.5),('wang',23,54.2)],dtype=persontype)
>>> b
array([(b'zhang', 32, 75.5), (b'wang', 23, 54.2)],
dtype={'names':['name','age','weight'], 'formats':['S32','<i4','<f4'], 'offsets':[0,32,36], 'itemsize':40, 'aligned':True})
>>> b[1]
(b'wang', 23, 54.2)
注:
(1)、通过a.tostring()或a.tofile()方法,可以将数组a以二进制的方式转换成字符串或者写入文件中。
(2)结构类型中可以包括其他的结构类型,当某个字段为数组时,用元祖的第三个参数表示其形状。
(3)、结构类型也可以以字典参数定义,字典的键为结构中的字段名,值为字段的类型描述,但是由于字典的键是没有顺序的,因此字段的顺序需要在类型描述中给出。类型描述是一个元组,它的第二个值给出字段的以字节为单位的偏移量。
>>> np.dtype({'name':('S25',0),'age':(np.uint8,25)})
dtype([('name', 'S25'), ('age', 'u1')])
7、内存结构
数据存储区域保存着数组中所有元素的二进制数据,dtype对象则知道如何将元素的二进制数据转换为可用的值。数组的维数和形状等信息都保存在ndarray数组对象的数据结构中。
>>> a = np.array([[0,1,2],[3,4,5],[6,7,8]],dtype = np.float32)
>>> a
array([[0., 1., 2.],
[3., 4., 5.],
[6., 7., 8.]], dtype=float32)
注:数组对象使用strides属性保存每个轴上相邻两个元素的地址差,即当某个轴的下标增加1时,数据存储区域指针所增加的字节数。当strides属性中的数值正好和对应轴所占据的字节数相同,那么数据在内存中是连续存储的。通过下标范围得到新的数组是原始数组的视图,即它和原始视图共享数据存储区域:
在Numpy中,默认以C语言格式存储数据。