NumPy和deque

import numpy as np

# 简单操作
# 1.新建一个0-11的整数的numpy.ndarray,然后把它打印出来
a = np.arange(12)
print(a)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]
print(type(a))  # <class 'numpy.ndarray'>

# 2.看看数组的维度,它是一个一维的,有12个元素的数组
print(a.shape)  # (12,)
# 3.把数组变成二维的
a.shape = 3, 4
print(a)
"""
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[ 8  9 10 11]
"""
# 4.打印出第2行
print(a[2])  # [ 8  9 10 11]
# 5.打印出第2行第1列的元素
print(a[2, 1])  # 9
print(a[:, 1])  # 把第1列的元素打印出来,[1 5 9]
# 6.把行和列交换,得到一个新数组
print(a.transpose())
"""
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
"""

# NumPy也可以对numpy.ndarray中的元素进行抽象的读取,保存和其他操作

# 1.从文本文件里读取1000万个浮点数,比较耗时
floats = np.loadtxt('floats-10M-lines.txt')
# 2.利用序列切片来读取其中的最后3个数
print(floats[-3:])  # [0.30815445 0.22208919 0.65914634]
# 3.把数组里的每个数都乘以0.5,再来看看最后3个数
floats *= .5
print(floats[-3:])  # [0.15407723 0.1110446  0.32957317]
# 4.导入高精度计时器
from time import perf_counter as pc

# 5.把每个元素都乘以3,可以看到处理1000万个浮点数所需的时间不足20毫秒
t0 = pc()
floats /= 3
print(pc() - t0)  # 0.0106946

# 6.把数组存入后缀为.npy的二进制文件,速度比较快
np.save('floats-10M', floats)
# 7.将上面的数据导入到另外一个数组里,这次load方法利用了一种叫做内存映射的机制,它让我们在内存不足的情况下仍然可以对数组做切片
floats2 = np.load('floats-10m.npy', 'r+')
# 8.把数组里每个数乘以6之后,再看一下数组的最后3个数
floats2 *= 6
print(floats2[-3:])  # [0.30815445 0.22208919 0.65914634]
# 双向队列和其他形式的队列

# 利用.append和.pop方法,我们可以把列表当作栈或者队列来使用.但是删除列表的第一个元素,或者是在第一个元素之前添加一个元素之类的操作是很耗时的,
# 因为这些操作会牵扯到移动列表里的所有元素.

# collections.deque类(双端队列)是一个线程安全,可以快速从两端添加或者删除元素的数据类型

from collections import deque

# 1.maxlen是一个可选参数,代表这个队列可以容纳的元素的数量,而且一旦设定,这个属性就不能修改了
dq = deque(range(10), maxlen=10)
print(dq)  # deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
# 2.队列的旋转操作接受一个参数n,当n>0时,队列的最右边的n个元素会被移动到队伍的左边.当n<0时,最左边的n个元素会被移动到右边.
dq.rotate(3)
print(dq)  # deque([7, 8, 9, 0, 1, 2, 3, 4, 5, 6], maxlen=10)
dq.rotate(-4)
print(dq)  # deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], maxlen=10)
# 3.当试图对一个已满的队列做头部添加操作的时候,它尾部的元素会被删除掉
dq.appendleft(-1)
print(dq)  # deque([-1, 1, 2, 3, 4, 5, 6, 7, 8, 9], maxlen=10)
# 4.在尾部添加3个元素的操作会挤掉-1,1和2
dq.extend([11, 22, 33])
print(dq)  # deque([3, 4, 5, 6, 7, 8, 9, 11, 22, 33], maxlen=10)
# 5.extendleft(iter)方法会把迭代器里的元素逐个添加到双向队列的左边,因此迭代器里的元素会逆序出现在队列里.
dq.extendleft([10, 20, 30, 40])
print(dq)  # deque([40, 30, 20, 10, 3, 4, 5, 6, 7, 8], maxlen=10)
import this
print(this)
posted @ 2020-06-17 16:41  怀心抱素  阅读(524)  评论(0编辑  收藏  举报