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)