除了列表,还有谁谁谁
数组
何时使用数组:需要一个只包含数字的列表;
数组可以做什么:
- 支持所有跟可变序列有关的操作,包括 .pop、.insert 和 .extend
- 提供从文件读取和存入文件的更快的方法,如 .frombytes 和 .tofile
如何创建数组
- 创建数组需要一个类型码,这个类型码用来表示在底层的 C 语言应该存放怎样的数据类型。
- b 类型码代表的是有符号的字符
数组的读取和写入:
array.tofile 和 array.fromfile 用起来很简单,它的速度也很快。
#从创建一个有 1000 万个随机浮点数的数组
from array import array
from random import random
floats = array('d',(random() for i in range(10**7)))
print(floats[-1])
print(len(floats))
0.275005837260377
10000000
# 写入文件数组
fp = open('floats.bin','wb')
# 把数组存入一个二进制文件里
floats.tofile(fp)
fp.close()
# 读取文件数组
floats2 = array('d')
fp = open('floats.bin','rb')
# 把 1000 万个浮点数从二进制文件里读取出来
floats2.fromfile(fp,10**7)
fp.close()
print(floats2[-1])
print(floats == floats2)
0.275005837260377
True
列表和数组的属性和方法
内存视图
memoryview 是一个内置类,它能让用户在不复制内容的情况下操作同一个数组的不同切片。在数据结构之间共享内存。
memoryview.cast 的概念跟数组模块类似,能用不同的方式读写同一块内存数据,而且内容字节不会随意移动。
import array
numbers = array.array('h',[-2,-1,0,1,2])
# memv 里的 5 个元素跟数组里的没有区别
memv = memoryview(numbers)
# 显示地址
print(memv)
print(len(memv))
print(memv[0],memv[1])
print(memv.tolist())
#把 memv 里的内容转换成 'B' 类型,也就是无符号字符
memv_oct = memv.cast('B')
print(memv_oct.tolist())
# 把位于位置 5 的字节赋值成 4
memv_oct[5] = 4
#占 2 个字节的整数的高位字节改成了 4
print(numbers)
<memory at 0x000001D5ECB1F648>
5
-2 -1
[-2, -1, 0, 1, 2]
[254, 255, 255, 255, 0, 0, 1, 0, 2, 0]
array('h', [-2, -1, 1024, 1, 2])
NumPy和SciPy
NumPy 和 SciPy不是标准的Python库,是第三方的库。它们提供的高阶数组和矩阵操作。正是有了这么强大的第三方库,让Python 成为科学计算应用的主流语言。Python的灵活强大也就是基于很多丰富的第三方库。
Numpy: 实现了多维同质数组(homogeneous array)和矩阵
Scipy: SciPy 是基于 NumPy 的另一个库,它提供了很多跟科学计算有关的算法,专为线性代数、数值积分和统计学而设计。
import numpy as np
a = np.arange(12)
print(a)
print(type(a))
print(a.shape)
a.shape = 3,4
print(a)
print(a.shape)
print(a[1])
print(a[:,1])
[ 0 1 2 3 4 5 6 7 8 9 10 11]
<class 'numpy.ndarray'>
(12,)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
(3, 4)
[4 5 6 7]
[1 5 9]
分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!