#%%
# 使用 jupyter notebook 编写
"""
本章知识目录:
1.array()
2.astype()
3.shape
4.reshape()
5.arrange()
6.linspace()
7.logspace()
8.empty()
9.zeros()
10.ones()
11.fromfunction()
12.存取元素
13.切片和索引
14.对位运算
15.广播
16.结构数组
17.内置操作函数
18.线性代数模块linalg
19.随机模块random
"""
"""
考试:
结构(最最重要)
新建、删除、引用、索引
切片的使用
广播要满足的条件(什么情况下才会广播)
函数部分不会多考
"""
import numpy as np
#%%
# np.array() 创建一个ndarray数组
np_ar = np.array([[1, 2, 3], [4, 5, 6]])
print(type(np_ar))
print(np_ar)
#%%
# np.astype() 使ndarray对象转换为指定类型
a = np.array(['1', '2', '3'])
print(a)
a = a.astype('float')
print(a)
a = a.astype("int_")
print(a)
#%%
# ndarray_name.shape 获得数组维数
a = np.array([1, 2, 3])
print(a.shape)
print(a)
c = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(c.shape)
print(c)
c.shape = 4, 3
print(c.shape)
print(c)
c.shape = 2, -1 # 自动计算长度
print(c.shape)
print(c)
#%%
# ndarray_name.reshape() 改变数组维数
c = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
d = c.reshape((6, 2)) # 对象.reshape(维数的元组)
print(d.shape)
print(d) # c和d 共享一块内存
#%%
# np.arrange()类似于python的range函数
d = np.arange(0, 1, 0.1) # 起始值,终值,步长(包括起始值,不包括终值)
print(d)
#%%
# np.linspace()
e = np.linspace(1, 10, 10, endpoint=False) # endpoint=False 不包括终值
print(e) # np.linspace(start, stop, num, endpoint=True, ~)
e = np.linspace(1, 10, 10, endpoint=True) # endpoint=True 包括终值
print(e) # 相当于是等差数列
#%%
# np.logspace()
f = np.logspace(0, 2, 20) # 起始值,终值,数量
print(f)
# np.logspace(start, stop, num, endpoint=True, base=10, dtype)
# 创建等比数列,从base^start到base^stop的含有num个数
#%%
# np.empty(), np.zeros(), np.ones()
a = np.empty((2, 4), np.int) # 只分配内存,不初始化
print(a)
b = np.zeros((3, 1), np.float)
print(b)
c = np.ones((2, 3), np.str)
print(c)
#%%
# 使用frombuffer、fromstring、fromfile、fromfunction、~从字节、文件等创建数组
def func(i):
return i*2+1
a = np.fromfunction(func, (10,)) # 第一个参数为每个数组元素的函数,第二个参数为数组的大小
print(a)
#%%
a = np.arange(10)
print(a[5])
print(a[3:5]) # 与Python的标准方法相同
a[6] = 100
print(a)
#%%
"""
存取元素:
3种方式
"""
# 1.使用下标范围存取元素
a = np.arange(10)
b = a[5:]
# 与Python列表不同,numpy数组切片产生原数组的一个视图,共享同一块内存
print(a)
print(b)
b[2] = 100
print(b)
print(a)
#%%
# 2.使用整数序列
# 使用整数序列中的每个元素作为下标,整数序列可以是列表或数组,获得的新数组,不与原数组共享内存空间
a = np.arange(10, 100, 10)
print(a)
b = a[[3, 7, 4, 2]]
print(b)
b = a[np.array([1, 2, 4])]
print(b)
b[2] = 1000
print(a)
print(b)
a[[1, 2, 3]] = -1, -2, -3 # 可以使用整数序列修改元素
print(a)
#%%
# 3.使用布尔数组
# 将使用布尔数组为True的对应下标的原数组中的元素
# 新产生的数组不与原数组共享相同的空间,只能只用布尔数组,不能使用布尔列表
a = np.arange(5, 0, -1)
print(a)
x = np.random.rand(10)
print(x)
x = x[x>0.6]
print(x)
a = np.array([1, 2, 3])
b = np.array([3, 2, 1])
print(a > b)
a = a[a==b]
print(a)
#%%
"""
切片和索引:
切片索引:切片索引和对列表list的切片索引相似,
不过由原本的一维切片变为多维
"""
a = np.array([range(6), range(6), range(6),
range(6), range(6), range(6)]) # range()函数的返回值就是列表
print(a)
print(len(a)) # 长度还是有的
count = 0
for i in range(6):
for j in range(6):
a[i, j] = count
count = count + 1
count = (i+1) * 10
print(a)
print(a[0, 3:5])
print(a[4:, 4:])
print("=====")
print(a[:, 2])
print(a[2::2, ::2])
print("=====") # 接下来是另一种情况
print(a[(0,1,2,3,4),(1,2,3,4,5)])
"""
用于存取数组的下标和仍然是一个有两个元素的组元,
组元中的每个元素都是整数序列,分别对应数组的第0轴和第1轴。
从两个序列的对应位置取出两个整数组成下标:a[0,1],a[1,2],...,a[4,5]
"""
print(a[3, [0, 2, 5]])
"""
下标中的第0轴是一个范围,它选取第3行之后的所有行;
第1轴是整数序列,它选取第0, 2, 5三列
"""
print("=====")
a = np.array([1, 2, 3, 4, 5, 6])
print(a)
b = a[:3]
print(b)
b[1] = 100
print("b:", b) # 说明上述切片共用一块内存
print("a:", a)
a[1] = 200
print("a:", a)
print("b:", b)
#%%
"""
对位运算:
指ndarray进行加减乘除运算时,使对应位置的数值进行加减乘除运算
"""
a = np.array([[4, 5, 6], [7, 8, 9]])
print(a)
b = np.array([[2, 3, 4], [5, 6, 7]])
print(b)
print("=====")
print("a+b:", a+b)
print("a-b:", a-b)
print("axb:", a*b)
print("a/b:", a/b)
#%%
"""
广播:
1.当两个ndarray的维度不一致时,则没有对齐的维度上会分别执行对位运算,
这种机制叫做广播(broadcasting)
2.广播的原则:如果两个数组的后缘维度(trailing dimension,
即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,
则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
3.广播主要发生在两种情况,一种是两个数组的维数不相等,
但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。
"""
# 数组维度不同,后缘维度的轴长相符
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([1, 2, 3]) #arr2.shape = (3,)
arr_sum = arr1 + arr2
print(arr_sum)
print("==========")
# 数组维度相同,其中有个轴为1
arr1 = np.array([[0, 0, 0],[1, 1, 1],[2, 2, 2], [3, 3, 3]]) #arr1.shape = (4,3)
arr2 = np.array([[1],[2],[3],[4]]) #arr2.shape = (4, 1)
arr_sum = arr1 + arr2
print(arr_sum)
#%%
""""
结构数组:
"""
persontype = np.dtype({'names':['name', 'age', 'weight'], 'formats':['S32','i', 'f']})
a = np.array([("Zhang",32,75.5), ("Wang",24,65.2)], dtype=persontype)
print(a.dtype)
print(a)
#%%
"""
内置操作函数:
1.数学函数
cos, cosh, sin sinh, tan, tanh 三角函数
arccos, arccosh, arcsin, arcsinh, arctan, arctanh 反三角函数
log 自然对数(e)
log10 基于10的对数
log2 基于2的对数
log1p 基于log(1+x)的对数
2.运算函数
diff(a, n=1, axis=1) 计算差分
a:输入矩阵
n:可选,代表要执行几次差值
axis:默认是最后一个
3.统计函数
提供了很多计算最大值、最小值、均值、中位数等统计量的函数
np.amax()、np.amin()、np.max()、np.min()、np.sum()、np.std()、
np.var()、np.mean()、np.median()、np.percentile()、np.average()
"""
# 数学函数
a = np.arange(1, 11)
print(a)
print(np.log(a))
# 运算函数
print(np.diff(a))
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(np.diff(a, axis=0)) # 对于二维矩阵,需要指明是对哪一个维度进行差分
# axis=0 纵轴 axis=1横轴(二维矩阵)
print(np.diff(a, 2, axis=0))
# 统计函数
#%%
"""
线性代数模块linalg:
特征值分解、Cholesky分解、SVD分解
"""
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([0, 1, 2])
print(np.linalg.norm(a)) # 计算矩阵a的范数
print(np.dot(a, b)) # 矩阵点积
print(np.trace(a)) # 矩阵的迹
print(np.linalg.det(a)) # 矩阵行列式值
print(np.linalg.matrix_rank(a)) # 矩阵的秩
c = np.array([[2, 1], [1, 2]])
u, v = np.linalg.eig(c) # 特征值分解
l = np.linalg.cholesky(c) # Cholesky分解
U, s, V = np.linalg.svd(c) # SVD分解,计算出的s需要重建为对角矩阵
S = np.array([[s[0], 0], [0, s[1]]])
print(S)
#%%
"""
随机模块random:
random.seed(666) 指定全局种子,
也可以使用random.RandomState(666) 的方式指定局部种子,
在指定局部种子的情况下,使用局部种子产生的随机数不改变
"""