Numpy 的基础使用 和 Jupter的基础快捷键

一、运行Anaconda启动Jupyter Notebook

在命令窗口中执行以下命令:

jupyter notebook

二、IPython快捷键

Jupyter Notebook 有两种键盘输入模式
  • 命令模式: 键盘输入运行程序命令;这时的单元框线为蓝色。
  • 编辑模式: 允许你往单元中键入代码或文本;这时的单元框线是绿色的

In [1]:

# 打印100
print(100)
100
In [ ]:
1、命令模式 (不区分大小写)
• Shift + Enter : 运行本单元,选中下个单元
• Ctrl + Enter : 运行本单元
• Alt + Enter : 运行本单元,在其下插入新单元
• Y : 单元转入代码状态
• M : 单元转入markdown状态
• A : 在上方插入新单元
• B : 在下方插入新单元
• DD : 删除选中的单元

In [ ]:a = 100

In [ ]# Python

In [4]:a = 100

In [5]:a

Out[5]:100

2、编辑模式 ( Enter 键启动)
• Shift + Enter : 运行本单元,选中下一单元  
• Ctrl + Enter : 运行本单元
• Alt + Enter : 运行本单元,在下面插入一单元

In [ ]:

3、其他常用快捷键
• Ctrl + A : 全选
• Ctrl + Z : 撤销
• Ctrl + C : 复制
• Ctrl + V : 粘贴
• Ctrl + / : 注释或取消注释

三、IPython的帮助文档

1. 使用help()

通过以下命令来获得帮助文档:

help(len)

In [8]:

help(len)
Help on built-in function len in module builtins:
len(obj, /)
    Return the number of items in a container.

2. 使用?

或者使用问号:

len?

In [9]:len?

还可以应用到自定义的变量和自定义的函数上来返回帮助文档

此外,使用两个??可以把函数的源代码显示出来

In [7]:def add(a, b):

    """add function"""
    return a + b
In [11]:add?

In [12]:add??

3. tab自动补全
  • tab : 代码补全或缩进
  • shift + tab 可以查看函数参数

四、IPython魔法命令

1. 运行外部Python文件

使用下面命令运行外部python文件(默认是当前目录,也可以使用绝对路径)

%run *.py

示例: 在当前目录下有一个myscript.py文件:

def square(x):
    """square a number"""
    return x ** 2

for N in range(1, 4):
    print(N, "squared is", square(N))

我们可以通过下面命令执行它:

%run myscript.py

In [15]:

%run myscript.py
1 squared is 1
2 squared is 4
3 squared is 9

尤其要注意的是,当我们使用魔法命令执行了一个外部文件时,该文件的函数就能在当前会话中使用

square(5)

In [17]:

square(5)
square(6)

Out[17]:36

In [18]:a = square(5)

b = square(6)

a, b

Out[18]:(25, 36)

In [19]:a = square(5)

b = square(6)

display(a, b)

25 36

In [20]:

a = square(5)
b = square(6)
print(a, b)
25 36

In [21]:

import myscript

. . .

2. 运行计时

用下面命令计算statement的运行时间:

%time statement

In [25]:

# %time :一般用来统计耗时较长代码的运行时长
%time square(1000)
Wall time: 0 ns

Out[25]:

1000000

用下面命令计算statement的平均运行时间:

%timeit statement

timeit会多次运行statement,最后得到一个更为精准的预期运行时间

In [27]

# %timeit会多次运行statement,最后得到一个更为精准的预期运行时间
%timeit square(1000)
390 ns ± 8.22 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [28]:

%timeit -r 3 -n 1000 square(1000)
360 ns ± 3.99 ns per loop (mean ± std. dev. of 3 runs, 1000 loops each)

可以使用两个百分号来测试多行代码的平均运行时间:

` %%timeit

statement1

statement2

statement3

`

In [30]:

%%timeit
quare(1000)
add(10, 20)
524 ns ± 12.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [31]:

%%time
square(1000)
add(10, 20)
Wall time: 0 ns

Out[31]:30

记住:

  • %time一般用于耗时长的代码段
  • %timeit一般用于耗时短的代码段

In [ ]:

3. 查看当前会话中的所有变量与函数 (了解)

快速查看当前会话的所有变量与函数名称:

%who

In [32]:%who
N a add b myscript numpy square

查看当前会话的所有变量与函数名称的详细信息:

%whos

In [33]:

%whos
Variable   Type        Data/Info
--------------------------------
N          int         3
a          int         25
add        function    
b          int         36
myscript   module      .Jupyter教程\\myscript.py'>
numpy      module      ges\\numpy\\__init__.py'>
square     function    

返回一个字符串列表,里面元素是当前会话的所有变量与函数名称:

%who_ls

In [34]:

%who_ls

Out[34]:

['N', 'a', 'add', 'b', 'myscript', 'numpy', 'square']
4. 安装包
  • 使用pip命令安装
    • pip install numpy

In [35]:

pip install numpy
Requirement already satisfied: numpy in c:\users\ijeff\appdata\roaming\python\python38\site-packages (1.21.5)
Note: you may need to restart the kernel to use updated packages.
5. 更多魔法命令

列出所有魔法命令

lsmagic

查看魔法命令的文档: 使用?

In [36]:

lsmagic

In [37]:

%run?

============================================

对应刚使用Jupyter Notebook的同学,需要多加练习,达到数量使用Jupyter写代码

============================================

练习1: 封装函数求闰年

In [38]:

def is_leap(y):
    return y%4==0 and y%100!=0 or y%400==0

In [40]:

is_leap(2032)

Out[40]:

True

练习2:封装函数实现冒泡排序

In [45]:

def my_sort(l):
    for i in range(len(l) - 1):
        for j in range(len(l) - i - 1):
            if l[j] > l[j+1]:
                l[j], l[j+1] = l[j+1] , l[j]
    return l

In [46]:

my_sort([1, 3, 6, 5, 2, 8, 7, 4])

Out[46]:

[1, 2, 3, 4, 5, 6, 7, 8

jupyter:01_JupyterNotebook使用教程 - Jupyter Notebook 

导入numpy库,并查看numpy版本

In [1]:

# 数据分析三剑客
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

In [2]:

# 版本
np.__version__

Out[2]:

'1.23.5'

In [3]:

# cat.jpg 
# 图片: 其实是数字组成的,三维数组
#  RGB  红Red, 绿Green,蓝Blue
#  RGB 范围:0~255
# plt.imread: 读取图片的数据
cat = plt.imread('cat.jpg')
cat
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
~\AppData\Local\Temp\ipykernel_30712\1529493578.py in 
      5 
      6 # plt.imread: 读取图片的数据
----> 7 cat = plt.imread('cat.jpg')
      8 cat

G:\Anaconda3\lib\site-packages\matplotlib\pyplot.py in imread(fname, format)
   2193 @_copy_docstring_and_deprecators(matplotlib.image.imread)
   2194 def imread(fname, format=None):
-> 2195     return matplotlib.image.imread(fname, format)
   2196 
   2197 

G:\Anaconda3\lib\site-packages\matplotlib\image.py in imread(fname, format)
   1561             "``np.array(PIL.Image.open(urllib.request.urlopen(url)))``."
   1562             )
-> 1563     with img_open(fname) as image:
   1564         return (_pil_png_to_float_array(image)
   1565                 if isinstance(image, PIL.PngImagePlugin.PngImageFile) else

G:\Anaconda3\lib\site-packages\PIL\Image.py in open(fp, mode, formats)
   3090 
   3091     if filename:
-> 3092         fp = builtins.open(filename, "rb")
   3093         exclusive_fp = True
   3094 

FileNotFoundError: [Errno 2] No such file or directory: 'cat.jpg'

In [ ]:

type(cat)
# numpy.ndarray  : 多维数组
#  nd : n维度,多维
#  array: 数组

In [ ]:

# 查看形状:三维
#  (421, 725, 3) : 
#     高度:421行
#     宽度:725列
#     3表式的是RGB(red, green, blue)的值
cat.shape

In [ ]:

# 显示图片
plt.imshow(cat)
# (421, 725, 3)

In [ ]:

# 图片:3维数据(彩色)
#           2维数据 (黑白)
# 视频:4维数据
#    (x, 421, 725, 3)​
# 一切皆数据,一切皆矩阵​

一、创建ndarray

  • ndarray是NumPy中表式数组的重要类型
1. 使用np.array()创建
  • 参数为列表: [1, 4, 2, 5, 3]

注意:

  • numpy默认ndarray的所有元素的类型是相同的
  • 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
  • ndarray的常见数据类型:
    • int: int8、uint8、int16、int32、int64
    • float: float16、float32、float64
    • str: 字符串

In [ ]:


l = [1, 4, 2, 3, 5, 6]
n = np.array(l)
n

In [ ]:


type(n)  # 类型
# numpy.ndarray

In [ ]:


n.shape  # 形状
# l.shape  # 列表没有shape

In [ ]:


# 优先级:str>float>int
n = np.array([3.14, 2, "hello"])
n
2. 使用np的routines函数创建

1) np.ones(shape, dtype=None, order='C')

  • 创建一个所有元素都为1的多维数组

参数说明:

  • shape : 形状
  • dtype=None: 元素类型
  • order : {‘C’,‘F’},可选,默认值:C 是否在内存中以行主(C-风格)或列主(Fortran-风格)顺序存储多维数据, 一般默认即可

In [ ]:


n = np.ones(shape=(3, 4))
n

In [ ]:


n = np.ones(shape=(3, 4, 5), dtype=np.int16)
# n = np.ones(shape=(3, 4), dtype=int)
n

2) np.zeros(shape, dtype=float, order='C')

  • 创建一个所有元素都为0的多维数组

参数说明:

  • shape : 形状
  • dtype=None: 元素类型

In [ ]:


n = np.zeros((5, 5), dtype=np.int16)
n

3) np.full(shape, fill_value, dtype=None, order='C')

  • 创建一个所有元素都为指定元素的多维数组

参数说明:

  • shape: 形状
  • fill_value: 填充值
  • dtype=None: 元素类型

In [ ]:


n = np.full(shape=(3, 4), fill_value=2)
n

4) np.eye(N, M=None, k=0, dtype=float)

  • 对角线为1其他的位置为0的二维数组

参数说明:

  • N: 行数
  • M: 列数, 默认为None,表示和行数一样
  • k=0: 向右偏移0个位置
  • dtype=None: 元素类型

In [ ]:


# 对角线为1其他的位置为0的二维数组
# 单位矩阵: 主对角线都是1,其他都是0
n = np.eye(6, 6, dtype=np.int8)
n

In [ ]:


# k=2 : 向右偏移2个位置
n = np.eye(6, 6, k=2, dtype=np.int8)
# k=-2 : 向左偏移2个位置
n = np.eye(6, 6, k=-2, dtype=np.int8)
n

5) np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

  • 创建一个等差数列

参数说明:

  • start: 开始值
  • stop: 结束值
  • num=50: 等差数列中默认有50个数
  • endpoint=True: 是否包含结束值
  • retstep=False: 是否返回等差值(步长)
  • dtype=None: 元素类型

In [ ]:


# 等差数列
# 1, 3, 5, 7, 9
n = np.linspace(0, 100, num=51, dtype=np.int16)
n

In [ ]:


# endpoint=False
n = np.linspace(0, 100, num=51, endpoint=False)
n

In [ ]:


# retstep=True : 显示步长
n = np.linspace(0, 100, num=51, retstep=True)
n

6) np.arange([start, ]stop, [step, ]dtype=None)

  • 创建一个数值范围的数组
  • 和Python中range功能类似

参数说明:

  • start : 开始值(可选)
  • stop: 结束值(不包含)
  • step: 步长(可选)
  • dtype=None: 元素类型

In [ ]:


n = np.arange(10)
n

In [ ]:


n = np.arange(2, 10)
n

In [ ]:


n = np.arange(2, 10, 2)
n

7) np.random.randint(low, high=None, size=None, dtype='l')

  • 创建一个随机整数的多维数组

参数说明:

  • low : 最小值
  • high=None: 最大值
    • high=None时,生成的数值在【0, low)区间内
    • 如果使用high这个值,则生成的数值在【low, high)区间
  • size=None: 数组形状, 默认只输出一个随机值
  • dtype=None: 元素类型b

In [ ]:


# 随机整数, 范围:[0, 3)
n = np.random.randint(3)
n

In [ ]:


# 随机整数, 范围:[3, 10)
n = np.random.randint(3, 10)
n

In [ ]:


# 随机整数:一维
n = np.random.randint(3, 10, size=6)
n

In [ ]:


# 随机整数:二维
n = np.random.randint(3, 10, size=(3, 4))
n

In [ ]:


# 随机整数:三维
# 0~255 
n = np.random.randint(0, 256, size=(20, 40, 3))
n

In [ ]:


plt.imshow(n)
实例: 读取猫图片的数据

In [ ]:


cat

In [ ]:


plt.imshow(cat)

8) np.random.randn(d0, d1, ..., dn)

  • 创建一个服从标准正态分布的多维数组

    标准正态分布又称为u分布,是以0为均数、以1为标准差的正态分布,记为N(0,1) 标准正态分布, 在0左右出现的概率最大, 越远离出现的概率越低, 如下图

  • 创建一个所有元素都为1的多维数组

参数说明:

  • dn : 第n个维度的数值

In [ ]:


n = np.random.randn()
n

In [ ]:


n = np.random.randn(10)
n

In [ ]:


n = np.random.randn(3, 4)
n

9)np.random.normal(loc=0.0, scale=1.0, size=None)

  • 创建一个服从正态分布的多维数组

参数说明:

  • loc=0.0: 均值, 对应着正态分布的中心
  • scale: 标准差, 对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
  • size=None: 数组形状

In [ ]:


n = np.random.normal(loc=100, scale=10, size=(3, 4))
n

10) np.random.random(size=None)

  • 创建一个元素为0~1(左闭右开)的随机数的多维数组

参数说明:

  • size=None: 数组形状

In [ ]:


n = np.random.random(size=(3, 4))
n

11) np.random.rand(d0, d1, ..., dn)

  • 创建一个元素为0~1(左闭右开)的随机数的多维数组
  • 和np.random.random功能类似, 掌握其中一个即可

参数说明:

  • dn : 第n个维度的数值

In [ ]:


n = np.random.rand(3, 4)
n

二、ndarray的属性

4个重要属性:

  • ndim:维度
  • shape:形状(各维度的长度)
  • size:总长度
  • dtype:元素类型

In [ ]:


cat

In [ ]:


cat.shape  # 三维数组
# (421, 725, 3)
#  第一个维度: 421
#  第二个维度: 725
#  第三个维度:3
# 有几个数字就表示 几维

In [ ]:


cat.ndim  # 维度

In [ ]:


cat.size  # 总数据量

In [ ]:


421 * 725 * 3

In [ ]:


cat.dtype  # 于是乃类型
# uint8 : 无符号整数,8位表式1个字节  0000 0000

三、ndarray的基本操作

1. 索引

一维与列表完全一致 多维时同理

In [ ]:


l = [1, 2, 3, 4, 5, 6]
l[0], l[-1]

In [ ]:


n = np.array(l)
n[0], n[-1]

In [ ]:


# 二维
n = np.random.randint(0, 10, size=(4, 5))
n

In [ ]:


# 找到最后一个数
n[3][4]
n[-1][-1]
# 简写
n[3, 4]
n[-1, -1]

In [ ]:


# 三维
n = np.random.randint(0, 100, size=(4, 5, 6))
n

In [ ]:


# 找到86
n[1][2][-1]
n[1, 2, -1]

根据索引修改数据

In [ ]:


n[1, 2, -1] = 886

In [ ]:


n

In [ ]:


n[1][2] = 100

In [ ]:


n

In [ ]:


n[1, 2] = [1, 2, 3, 4, 5, 6]
n
2. 切片

一维与列表完全一致 多维时同理

In [ ]:


# Python列表中的切片
l = [1, 2, 3, 4, 5, 6, 7, 88, 9]
l[2 : 6]
l[: : -1]  # 翻转

In [ ]:


# NumPy 数组
n = np.array(l)
n

In [ ]:


n[2 : 6], l[: : -1]

In [ ]:


# 二维 或多维
n = np.random.randint(0, 10, size=(6, 8))
n

In [ ]:


# 行
# 取一行: 索引
print(n[0])
# 取连续多行: 切片
print(n[ 1 : 4 ])
# 取不连续的多行: 中括号
print(n[ [1, 4, 2, 2, 2] ])

In [ ]:


# 列
n

In [ ]:


# 列
# 取一列
print( n[ 1:4 , 0] )  # 取所有行,和第0列
# 取连续的多列: 切片
print( n[ : , 2 : 5] )
# 取不连续的多列: 中括号
print( n[ : , [1, 3, 4]] )
实例: 把猫图片翻转

In [ ]:


n = np.random.randint(0, 100, size=(5, 6))
n

In [ ]:


# 行翻转
n[ : : -1]

In [ ]:


# 列翻转: 相当于是对第二个维度做翻转
n[:, ::-1]

In [ ]:


cat

In [ ]:


cat.shape  # 3维

In [ ]:


# 原图
plt.imshow(cat)

In [ ]:


# 行翻转:上下翻转
plt.imshow( cat[::-1] )  

In [ ]:


# 列翻转:左右翻转
plt.imshow( cat[:, ::-1] )  

In [ ]:


# 对颜色翻转: RGB => BGR
plt.imshow( cat[:, :, ::-1])

In [ ]:


plt.imshow( cat[::10, ::10, ::-1])
3. 变形

使用reshape函数

In [ ]:


n = np.arange(1, 21)
n

In [ ]:


# reshape: 将数组改变形状
n.shape

In [ ]:


# 变成二维
n2 = np.reshape(n, (4, 5))
n2

In [ ]:


n2.shape

In [ ]:


n2.reshape((5, 4))
n2.reshape(5, 4)
# 变成1维
# 使用-1 : 表式任意剩余维度长度
n2.reshape(20)
n2.reshape(-1)
n2.reshape(4, -1)
n2.reshape(5, -1)
n2.reshape(-1, 2)
n2.reshape(-1, 1)
n2.reshape(2, -1, 2)
4. 级联

np.concatenate()

  • 参数是列表或元组
  • 级联的数组维度必须相同
  • 可通过axis参数改变级联的方向

In [ ]:


n1 = np.random.randint(0, 100, size=(3, 5))
n2 = np.random.randint(0, 100, size=(3, 5))
display(n1, n2)

In [ ]:


# 级联,合并
np.concatenate((n1, n2))  # 默认上下合并
np.concatenate((n1, n2), axis=0)  # 上下合并 axis=0表式第一个维度(行)

In [ ]:


# 左右合并 axis=1 表式第2个维度(列)
np.concatenate((n1, n2), axis=1)

np.hstack与np.vstack

  • 水平级联与垂直级联

In [ ]:


# np.hstack : 水平级联,左右合并
np.hstack((n1, n2))

In [ ]:


# np.vstack: 上下合并,垂直级联
np.vstack((n1, n2))
5. 切分/拆分/分割

与级联类似,三个函数完成切分工作:

  • np.split
  • np.vsplit
  • np.hsplit

In [ ]:


n = np.random.randint(0, 100, size=(6, 4))
n

In [ ]:


# 垂直拆分,平均拆成3份
np.vsplit(n, 3)

In [ ]:


# 可以按照指定位置拆分
np.vsplit(n, (1, 2, 4))

In [ ]:


# 水平方向拆分
np.hsplit(n, 2)

In [ ]:


n

In [ ]:


# split: 可以做水平或垂直拆分
#  axis=0 行
#  axis=1 列
np.split(n, 2)  # 默认按行拆分
np.split(n, 2, axis=0)  # 按行拆分
np.split(n, 2, axis=1)  # 按列拆分
实例:把猫拆分

In [ ]:


cat.shape

In [ ]:


cat2 = cat[ : -1]
cat2.shape

In [ ]:


plt.imshow(cat2)

In [ ]:


cat3 = np.split(cat2, 2)
cat3[0]  # 上半部分
cat3[1]  # 下半部分
plt.imshow(cat3[0])

In [ ]:


plt.imshow(cat3[1])

In [ ]:


# 水平拆分
cat4 = np.split(cat2, 5, axis=1)
cat4
plt.imshow(cat4[2])
6. 副本/复制/拷贝

copy()函数创建副本

In [ ]:


# 赋值 : 用的是同一个内存
n = np.arange(10)
n2 = n
n2[0] = 100
display(n, n2)

In [ ]:


# 拷贝: copy
n1 = np.arange(10)
# n1
n2 = n1.copy()
n2[0] = 100
display(n1, n2)

In [ ]:


# 深拷贝copy
n = np.random.randint(0, 10, size=(2, 3))
n2 = n.copy()
n2[0, 0] = 100
display(n, n2)

四、ndarray的聚合操作

1. 求和np.sum

In [ ]:


n = np.arange(10)
n

In [ ]:


np.sum(n)

In [ ]:


n = np.random.randint(0, 10, size=(3, 5))
n

In [ ]:


np.sum(n)  # 所有数的和

In [ ]:


# axis=0 : 表式每一列的多行求和
np.sum(n, axis=0)

In [ ]:


# axis=1 : 表式每一行中的多列求和
np.sum(n, axis=1)
2. 其他常见聚合函数
  • np.min 最小值
  • np.max 最大值
  • np.mean 平均值
  • np.average 平均值
  • np.median 中位数
  • np.percentile 百分位数
  • np.argmin 最小值对应的下标
  • np.argmax 最大值对应的下标
  • np.std 标准差
  • np.var 方差
  • np.power 次方,求幂
  • np.argwhere 按条件查找

In [ ]:


n = np.random.randint(0, 10, size=(3, 5))
n

In [ ]:


np.max(n)  # 最大值
np.min(n)  # 最小值
np.mean(n)  # 平均值
np.average(n)  # 平均值
np.median(n)  # 中位数
np.percentile(n, q=0.5)  # 百分位数, q=50表式中位数
n = n.reshape(-1)
display(n)
np.argmax(n)  # 第一个最大值对应的下标
np.argmin(n)  # 第一个最小值对应的下标
np.argwhere(n==np.max(n))  # 按条件找到所有最大值的下标
np.power(n, 3)  # 次方
# n ** 3
np.std(n)  # 标准差
np.var(n)  # 方差
3. np.sum 和 np.nansum(nan: not a number)
  • nan : 数值类型,not a number :不是一个正常的数值,表式空
  • np.nan : float类型

In [ ]:


n = np.array([1, 2, 3, np.nan])
n

In [ ]:


np.sum(n)  # 无法求出和

In [ ]:


np.nansum(n)  # 排除掉nan之后,剩下的数的和

五、ndarray的矩阵操作

1. 基本矩阵操作

1) 算术运算符:

  • 加减乘除

In [4]:


n = np.random.randint(0, 10, size=(4, 5))
n

Out[4]:

array([[9, 1, 4, 1, 7],
       [7, 1, 9, 8, 2],
       [4, 4, 7, 5, 3],
       [9, 5, 1, 0, 3]])

In [5]:


# n + 10  # 加
# n - 10  # 减
n * 10  # 乘
# n / 10  # 除
# n // 2  # 整除
# n ** 2  # 次方
# n % 2  # 余数

Out[5]:

array([[90, 10, 40, 10, 70],
       [70, 10, 90, 80, 20],
       [40, 40, 70, 50, 30],
       [90, 50, 10,  0, 30]])

In [ ]:


n1 = np.random.randint(0, 10, size=(4, 5))
n2 = np.random.randint(0, 10, size=(4, 5))
display(n1, n2)

In [ ]:


n1 + n2
n1 * n2

2) 线性代数

  • 矩阵积np.dot()
    • 第一个矩阵的列数 等于 第二个矩阵的行数

In [ ]:


n1 = np.random.randint(0, 5, size=(2, 3))
n2 = np.random.randint(0, 5, size=(3, 2))
display(n1, n2)

In [ ]:


np.dot(n1, n2)
#     [4, 3, 4],
#     [1, 2, 4]
#
#     [4, 3],
#     [4, 4],
#     [0, 4]
#
#     = [4*4 + 3*4,  4*3+3*4+4*4]
#         [1*4 + 2*4,  1*3+2*4+4*4]

#     =[28, 40]
#        [12, 27]
  • 线性代数中其他矩阵操作

In [ ]:


# 线性代数常用
n = np.array([[1, 2, 3], 
                      [2, 5, 4], 
                      [4, 5, 8]])
# 矩阵逆
np.linalg.inv(n)
# 矩阵的行列式
np.round(np.linalg.det(n))
# 行列式计算: 矩阵的所有主对角线-所有副对角线
# 1*5*8 + 2*4*4 + 3*2*5 - (3*5*4 +2*2*8 + 1*4*5 )  =  -10
# 矩阵的秩 (满秩矩阵,奇异矩阵)
# 方阵
np.linalg.matrix_rank(n)
2. 广播机制

【重要】ndarray广播机制的两条规则

  • 规则一:为缺失的维度补维度
  • 规则二:缺失元素用已有值填充

例1:

m = np.ones((2, 3))
a = np.arange(3)
求m+a

In [ ]:


m = np.ones((2, 3), dtype=np.int8)
a = np.arange(3)
display(m, a)

In [ ]:


m + a

例2:

a = np.arange(3).reshape((3, 1))
b = np.arange(3)
求a+b

In [ ]:


a = np.arange(3).reshape((3, 1))
b = np.arange(3)
display(a, b)

In [ ]:


a + b

习题:

a = np.ones((4, 1))
b = np.arange(4)
求a+b

In [ ]:


a = np.ones((4, 1), dtype=np.int8)
b = np.arange(4)
display(a, b)

In [ ]:


a + b
3. 其他常见数学操作
  • abs、sqrt、square、exp、log、sin、cos、tan、round、ceil、floor、cumsum

In [ ]:


n = np.array([1, 4, 8, 9, 16, 25, 64])
np.abs(n)  # 绝对值
np.sqrt(n)  # 平方根
# n ** 0.5
np.square(n)  # 平方
# n ** 2
np.exp(n)  # 指数 e=2.718281828459045
np.log(n)  # 自然对数:以e为底的对数, ln3
np.log(np.e)  # 1
np.log(1)  # 0
np.log2(n)  # 2为底的对数
np.log10(n)  # 10为底的对数,常用对数
np.sin(n)  # 正弦
np.cos(n)  # 余弦
np.tan(n)  # 正切
np.round(n, 2)  # 四舍五入
np.ceil(n)  # 向上取整
np.floor(n)  # 向下取整
np.cumsum(n)  # 累加
# [1, 4, 8,  9,  16,  25,  64]
# [1, 5,13, 22, 38,  63, 127]

六、ndarray的排序

快速排序

np.sort()与ndarray.sort()都可以,但有区别:

  • np.sort()不改变输入
  • ndarray.sort()本地处理,不占用空间,但改变输入

In [ ]:


n1 = np.random.randint(0, 10, size=6)
n1

In [ ]:


# 不改变原数组
n2 = np.sort(n1)
n2

In [ ]:


n1

In [ ]:


n3 = np.random.randint(0, 10, size=6)
n3

In [ ]:


n3.sort()

In [ ]:


n3

七、ndarray文件操作

保存数组
  • save : 保存ndarray到一个npy文件
  • savez : 将多个array保存到一个npz文件中

In [ ]:


x = np.arange(5)
y = np.arange(10, 20)
# save: 保存x.npy
np.save('x', x)
# savez
np.savez('arr.npz', xarr=x, yarr=y)
读取数组

In [ ]:


# 读取npy文件
np.load('x.npy')
# 读取npz文件
np.load('arr.npz')['xarr']
csv、txt文件的读写操作

In [ ]:


n = np.random.randint(0, 10, size=(3, 4))
n

In [ ]:


# 存储到csv或txt
# delimiter=',': 分隔符
np.savetxt('arr.csv', n, delimiter=',')

In [ ]:


# 读取csv或txt
np.loadtxt('arr.csv', delimiter=',', dtype=np.int16)

Jupyter:02_Numpy课程代码 - Jupyter Notebook

你可能感兴趣的:(numpy)