python科学计算学习笔记(1)

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语言格式存储数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值