numpy

numpy

1.numpy简介与安装

- 简介
	numpy(Numerical Python)是一个开源、高性能、功能强大的用于多维数组计算的python库。该库提供了大量的库函数和操作用于数值计算。

- 安装
	在线安装
		pip3 install numpy
	离线安装
		pip3 install numpy-1.15.4+mkl-cp36-cp36m-win_amd64.whl 去https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy下载

2.numpy操作

- 数组创建
	numpy的核心是ndarray对象, 可以使用numpy数组执行逻辑,统计和傅里叶变换等运算。
	创建方式:
		1. 使用numpy内部功能函数
#!/usr/bin/env python
#! -*- coding:utf-8 -*-
#!@Author: faple
#!@Time: 2019/1/11 9:16

import numpy as np
# 创建一维数组
arr = np.arange(1,10,2)
print(arr)

# 创建多维数组
arr = np.arange(12).reshape(2,2,3)
print(arr)

# 置0数组
arr = np.zeros((2, 3))
print(arr)

# 置1数组
arr = np.ones((3,3))
print(arr)

# 随机
arr = np.empty((2,2))
print(arr)

# 给定值数组
arr = np.full((3, 3), 2)
print(arr)

# 单位矩阵
arr = np.eye(3)
print(arr)

# 获得范围内均匀分布的数组
arr = np.linspace(0,10, num=5)
print(arr)

# 堆叠成更高维度的数组
arr = np.indices((2,3))
print(arr)

# 列表转换
arr = np.array([1,2,3])
print(arr)
arr = np.array([(1,1,1), (2,2,2)])
print(arr)

# 随机数生成
arr = np.random.rand(2,3)
print(arr)
- 数据类型
	下面是numpy中支持的数据类型, 创建数组时可以由dtype来指定或者astype和相关的类型方法

数据类型

描述

bool_

bool类型(True or False) 1个字节

int_

int类型 默认是int32或int64

int8

1个字节

int16

2个字节

int32

4个字节

int64

8个字节

uint8

无符号整数

uint16

无符号整数

uint32

无符号整数

uint64

无符号整数

float_

float64的简写

float16

半精度

float32

单精度

float64

双精度

complex_

complex128的简写]

complex64

复数, 由2个32位的浮点数指定

complex128

复数, 由2个64位的浮点数指定

- 索引与切片
	ndarray的内容可以通过索引和切片来访问和修改,类似python中的list的切片
# 一维数组
arr = np.arange(10)
# 使用slice函数
print(arr[slice(1,5,2)])
print(arr[1:5:2])
print(arr[1:])
print(arr[1:5])

# 多维数组
arr = np.arange(12).reshape(3,4)
print(arr[1:])
print(arr[:1])
# 第二行元素
print(arr[1,...])
# 第二列元素
print(arr[...,1])
print(arr[:,1])
print(arr[1:2,1:4])

# 整数数组索引
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 表示(0,0)(1,1)(2,2)三点
print(arr[[0, 1, 2], [0, 1, 2]])
print(arr[[0,0], [1,1]])

# 布尔索引
arr = np.array([[1,2], [3, 4], [5, 6]])
print(arr[arr>2])
arr = np.array([np.nan,  1,2,np.nan,3,4,5])
print(arr[~np.isnan(arr)])

# 花式索引
# 一维数组获取对应的值,二维数组获取对应的行
arr = np.arange(40).reshape(8,5)
print(arr[[1,2,3,4]])
- 广播
	numpy中的广播用来对不同形状的数组进行数值运算,如下
# 矩阵相加的几种方式
# 第一种方式
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x)
print(y)
for i in range(4):
    y[i, :] = x[i, :] + v
print(y)

# 第二种方式
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
vv = np.tile(v, (4, 1))
print(vv)
print(x+vv)

# 第三种方式 广播
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v
print(y)
# 演示
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1])
y = x + v
print(y)
规则如下:
		a. 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加 1 补齐。
		b. 输出数组的形状是输入数组形状的各个维度上的最大值。
		c. 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为 1 时,这个数组能够用来计算,否则出错。
		d. 当输入数组的某个维度的长度为 1 时,沿着此维度运算时都用此维度上的第一组值。

- 数学函数
	相关数学函数参考https://www.numpy.org.cn/reference/ufuncs/available_ufuncs.html
- IO
	numpy可以读写磁盘上的二进制和文本数据
arr = np.array([[1,1,1,1],[2,2,2,2]])
arr1 = np.array([[3,4,3,4],[5,5,5,5]])
# 保存数据 扩展名是npy
np.save('test',arr)
# 加载数据
print(np.load('test.npy'))
# 保存多个数组,扩展名为npz
np.savez('test1', arr, arr1)
# 加载数据
arrs = np.load('test1.npz')
# 查看数组名
print(arrs.files)
# 获取数组
print(arrs['arr_0'])
# 保存为文本文件
# np.loadtxt(FILENAME, dtype=int, delimiter=' ')
# np.savetxt(FILENAME, a, fmt="%d", delimiter=",")
np.savetxt('test',arr,fmt='%d', delimiter=',')
print(np.loadtxt('test', delimiter=','))
- 线性代数
# 矩阵运算
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.eye(2, 3)
# 矩阵相加
print(arr1+arr2)
# 矩阵相减
print(arr1-arr2)
# 转置矩阵
print(arr2.T)
# 矩阵相乘
print(np.dot(arr1, arr2.T))
# 矩阵向量点积
print(np.vdot(arr1, arr2))
# 逆矩阵
print(np.linalg.inv(np.array([[3, 1], [1, 2]])))
# 计算矩阵的行列式
print(np.linalg.det(np.array([[3, 1], [1, 2]])))
# 计算线性方程的值
a = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
x = np.linalg.solve(a, b)
print(x)
# 傅里叶变换
print(np.fft.fft(arr1))
# 反傅里叶变换
print(np.fft.ifft(arr1))