山东大学Python(9)——NumPy

#%%
# 使用 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) 的方式指定局部种子,
    在指定局部种子的情况下,使用局部种子产生的随机数不改变
"""

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值