Python极简读书笔记(六)Numpy向量计算

238 阅读3分钟

image-20221107175600126image-20221107175600126

  • 问:为什么需要Numpy?

    • image-20221107175732973
import numpy as np
print(np.__version__)

Numpy最重要的特性——ndarray :支持N维数组对象

  • 问:python列表和ndarray最大的区别是什么?

    • 列表元素可以是字符串、字典、元组中的一种或多种
    • Numpy数组中的元素必须数统一中数据类型
  • 问:什么是Numpy就高不就低类型转换规则?

    • image-20221107192243597
  • Numpy常用命令
# np.array
data = [6, 8.5, 9, 0]
arr1 = np.array(data)
data2 = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(data2)
>>> arr2: array([[1,2,3,4],[5,6,7,8]])
        # 嵌套序列转为与嵌套级别相适配的高维数组# astype()
arr1 = arr1.astype(np.int32)
​
# np.arrange(start, stop, step, dtype)
arr3 = np.arange(10) 
arr3 = arr3 + 1 # 这是向量加,每个元素加1  
                ### 这就是“广播”机制# np.linspace(start, stop, num)
c = np.linspace(1, 10, 20) # 1-10之间均匀等分取20个数,左闭右闭
  • Numpy其他常用函数
# 0/1填充
np.ones((3,4))
np.zeros((2,3)) # (2,3)元组匿名函数
>> 等价于
np.zeros(shape = [3,4])
np.ones(shape = [3,4], dtype = float)
​
# np.zeros_like(array)
array = np.array([[1, 2, 3.0],[4, 5, 6]])
b_zeros = np.zeros_like(array)
​
# np.ones_like(array)
# np.empty_like()
# np.full_like()# ndarray.reshape()
arr = np.arange(6)
arr = arr.reshape((2,3)) # (2,3)元组
>>> arr:
>>> array([[0,1,2],
            [3,4,5]])

N维数组的属性

ndarray: 属性都是不带括号的!!!

image-20221107200340172

# ndarray.ndim 几维数组
array = np.arange(1, 10)
array.ndim # 1# ndarray.shape 数组的形状
array.shape # (9,)# ndarray.size
array.size # 9

image-20221107200956658

二维数组也被称为2D张量

Numpy数组的运算

向量运算、算术运算、逐元素运算

向量运算

加减乘除+平方

image-20221107201518147

a * b 等价于 np.multiply(a, b)

统计函数

image-20221107201611016

逐元素运算与张量点乘运算

image-20221107202717460

image-20221107202730791

# 数学矩阵乘法 点乘
np.dot(a, b)
​
>>> 等价于
​
a2 = np.mat(a)
b2 = np.mat(b)
a2 * b2

矩阵运算

a = np.array([0,1,2,3])
a2 = np.mat(a)
​
a2.I # 逆矩阵
a2.T # 转置矩阵
a2.A # 返回二维矩阵对应的二维数组

爱因斯坦求和约定

einsum()

!!!!! 待定

Numpy中的轴方向

约减 Reduce 规约

image-20221107205415147

axis

image-20221107205502687

image-20221107205545898

操作数组元素

通过索引访问数组元素

  • 索引index

image-20221108115209889

one_dim[0]
two_dim[0][1]
two_dim[0][2] = 100
  • 切片访问

image-20221108145102996

  • 二维数组的转置和展平

transpose()方法将二维数组转置

image-20221108150214294

ravel()完成展平——比如将多维数组降维成一维数组

flatten()

shape(1,-1)

image-20221108155108569

ravel()返回的是原始数组视图,flatten会完成从原始数据到新内存空间的深拷贝。原始数组都不会发生任何变化。

  • 问:视图是什么概念?

    • 视图就是说不会拷贝原来的内容,而是指向原来的内容

image-20221108155417335

Numpy广播

image-20221108155706475

image-20221108155717818

Numpy数组的高级索引

  • Fancy Indexing

image-20221108172120601

image-20221109111452423

  • 布尔索引

image-20221109111806474

数组的堆叠操作

堆叠 stack

  • 水平方向堆叠 horizontal stack ----- hstack()

    • image-20221109142604920
    • 等价于 np.concatenate((arr1, arr2), axis = 1)
  • 垂直方向堆叠 vertical stack ------ vstack()

    • image-20221109142706216
    • 等价于 np.concatenate((arr2, arr3))
  • 深度方向堆叠 depth-wise stack ------- dstack()

    • image-20221109143323042

concatenate()

  • 按列方向堆叠column_stack()

    • image-20221109144328609
    • image-20221109144536217
  • row_stack()

    • image-20221109144621286

数组的分割操作

  • hsplit()

    • image-20221109145038191
    • image-20221109145956675
    • 分割成多个部分
  • vsplit()

  • dsplit()

  • split()可以通过设置分割方向实现上诉三个split功能

Numpy中的随机数模块

numpy.random

随机数是由随机种子根据一定的规则计算出来的数值,所以如果计算方法一定随机种子一定,那么随机数就不会变。若不设定随机种子,随机数生成器会将系统时间作为随机种子来生成随机数。

import numpy as np
•
rdm = np.random.RandomState(1) # 定义随机种子
np.random.seed(19680101) # 定义随机种子
•
rand = np.random.rand(2, 3) # 随机数服从均匀分布
print(rand)
•
randn = np.random.randn(2, 3) # 随机数服从正态分布
print(randn)
•
randint = np.random.randint(1, 10, (2,3)) # 生成2X3的1-10内的随机整数
print(randint)
•
random = np.random.random((2,3)) # 在[0,1)之间生成随机数
print(random)
​
>>>>>
[[0.23675601 0.59353868 0.74897519]
 [0.66065819 0.8813292  0.93499822]]
[[-0.40220931 -0.43350804 -0.60667041]
 [ 0.84595394 -0.25406136 -0.97673417]]
[[8 5 6]
 [8 6 4]]
[[0.23670515 0.4502083  0.20860286]
 [0.65182319 0.23997355 0.63095928]]