现从一张图片上去认识numpy
代码:
import numpy as np
import matplotlib.pyplot as plt
#对着函数的括号按 shift + tab
cat=plt.imread('cat.jpg')
type(cat)
#jpg的图片 颜色取值范围是 0-255 RGB
#png的图片 颜色取值范围 0-1 RGB
cat
plt.imshow(cat)
演示:
Numpy
numeric python 数字化的python,是python钟的数值计算的基础包。大部分提供科学计算的包都依赖于numpy。
- ndarray支持矢量化运算,不需要循环,可以节省时间和空间。
- 实现线性代数、随机数生成以及傅里叶变换。
- 用C、C++等其它的代码编写的C API。
numpy中最重要的一个形式叫ndarray n 表示的是n个 d dimension 维度 array 数组
Python 本身支持的数值类型有 int
(整型,python2 中存在 long 长整型)、float
(浮点型)、bool
(布尔型) 和 complex
(复数型)。
而 Numpy 支持比 Python 本身更为丰富的数值类型,细分如下:
-
bool
:布尔类型,1 个字节,值为 True 或 False。 -
int
:整数类型,通常为 int64 或 int32 。 -
intc
:与 C 里的 int 相同,通常为 int32 或 int64。 -
intp
:用于索引,通常为 int32 或 int64。 -
int8
:字节(从 -128 到 127) tinyint(tinyint 1字节 -2 ^7 ~ 2^7-1 (-128~127))
-
int16
:整数(从 -32768 到 32767) smallint(smallint 2字节 -2 ^15 ~ 2^15-1 (-32768~32765))
-
int32
:整数(从 -2147483648 到 2147483647) int(int 4字节 -2 ^31~ 2^31-1 (-2147483648~2147483647))
-
int64
:整数(从 -9223372036854775808 到 9223372036854775807) bigint(bigint 8字节 -2 ^63 ~ 2^63-1)
-
uint8
:无符号整数(从 0 到 255) unsigned -
uint16
:无符号整数(从 0 到 65535) -
uint32
:无符号整数(从 0 到 4294967295) -
uint64
:无符号整数(从 0 到 18446744073709551615) -
float
:float64 的简写。 -
float16
:半精度浮点,5 位指数,10 位尾数 -
float32
:单精度浮点,8 位指数,23 位尾数 -
float64
:双精度浮点,11 位指数,52 位尾数 -
complex
:complex128 的简写。 -
complex64
:复数,由两个 32 位浮点表示。 -
complex128
:复数,由两个 64 位浮点表示。
20.pandas.datetimes
时间类型
在 Numpy 中,上面提到的这些数值类型都被归于 dtype(data-type)
对象的实例。
我们可以用 numpy.dtype(object, align, copy)
来指定数值类型。而在数组里面,可以用 dtype=
参数。
代码:
type(123+123.123j)
演示:
2.1 Numpy 中,ndarray
类具有六个参数,它们分别为:
>>shape:数组的形状。
>>dtype:数据类型。
buffer:对象暴露缓冲区接口。
offset:数组数据的偏移量。
strides:数据步长。
order:{
'C','F'},以行或列为主排列顺序。
下面,我们来了解创建 ndarray 的一些方法。在 numpy 中,我们主要通过以下 5 种途径创建数组,它们分别是:
1.从 Python 数组结构列表,元组等转换。
2.使用 np.arange、np.ones、np.zeros 等 numpy 原生方法。
3.从存储空间读取数组。
4.通过使用字符串或缓冲区从原始字节创建数组。
5.使用特殊函数,如 random。
代码:
import numpy as np
#m行n列
np.ndarray(shape=(3,3),dtype='int8')
演示:
2.2 从列表或元组转换
在 numpy 中,我们使用 numpy.array 将列表或元组转换为 ndarray 数组。其方法为:
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
其中,参数:
object
:列表、元组等。dtype
:数据类型。如果未给出,则类型为被保存对象所需的最小类型。copy
:布尔来写,默认 True,表示复制对象。
下面,通过列表创建一个 ndarray 数组:
代码:
li = [1,2,3,4,5]
#array强制转换为ndarray类型
np.array(li),np.array(li)[-1]
演示:
代码:
tup = 1,2,3,4,5
#array强制转换为ndarray类型
np.array(tup),np.array(tup)[-1]
演示:
代码:
set = {
1,2,3,4,5,4,3,2,1}
#首先array是一个序列类型,下标是连续的
np.array(set)
演示:
代码:
di = dict(a=1,b=2,c=3)
#dict的key是set类型
np.array(di)
演示:
jit技术—预编译技术
代码:
import numba as nb
#JIT技术预编译技术 just in time
import numpy as np
def a():
return sum(list(range(100000)))
#先把函数b()给编译了
@nb.jit(nopython=True)
def b():
return np.sum(np.arange(100000))
%time a()
%time b()
2.3 arange
方法创建ndarray
除了直接使用 array 方法创建 ndarray,在 numpy 中还有一些方法可以创建一些有规律性的多维数。首先,我们来看一看 arange()。arange() 的功能是在给定区间内创建一系列均匀间隔的值。方法如下:
numpy.arange(start, stop, step, dtype=None)
你需要先设置值所在的区间,这里为 ``[开始, 停止),你应该能发现这是一个半开半闭区间。然后,在设置
step步长用于设置值之间的间隔。最后的可选参数
dtype可以设置返回
ndarray` 的值类型。
举个例子:
代码:
list(range(100))
演示:
代码:
np.arange(1,100,2)
演示:
2.4 linspace
方法创建
linspace
方法也可以像arange
方法很像,创建数值有规律的数组。inspace
用于在指定的区间内返回间隔均匀的值。其方法如下:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
start
:序列的起始值。
stop
:序列的结束值。num
:生成的样本数。默认值为50。endpoint
:布尔值,如果为真,则最后一个样本包含在序列内。retstep
:布尔值,如果为真,返回间距。dtype
:数组的类型。
举个例子:
代码:
np.linspace(-10,10,100)
演示:
logspace是线性生成,并且以什么为底
start从几开始
stop 到数字结尾
num 生成多少个数
base 表示的是底数 默认以10为底
代码:
10**-2
演示:
代码:
np.log10(0.01)
演示:
代码:
np.log2(256)
演示:
代码:
np.log(100000)
演示:
代码:
np.logspace(1,10,10)
演示:
2.5.1 ones
方法创建
numpy.ones
用于快速创建数值全部为 1 的多维数组。其方法如下:
numpy.ones(shape, dtype=None, order='C')
其中:
shape
:用于指定数组形状,例如(1, 2)或 3。
dtype
:数据类型。
order
:{'C','F'}
,按行或列方式储存数组。
举个例子:
线性代数:
标量:0维的 100 向量:1维的 [4,7,2] 矩阵: 2维的
张量: 3维及以上
代码:
o = np.ones(shape=(5,4),dtype='int8')
o
演示:
代码:
o.dtype
演示:
2.5.2 zeros
方法创建
zeros 方法和上面的 ones 方法非常相似,不同的地方在于,这里全部填充为 0。zeros 方法和 ones 是一致的。
numpy.zeros(shape, dtype=None, order='C')
其中:
shape
:用于指定数组形状,例如(1, 2)
或3
。
dtype
:数据类型。
order
:{'C','F'}
,按行或列方式储存数组。
举个例子:
代码:
#它是零矩阵
z = np.zeros(shape=(3,3),dtype='int8')
z
演示:
矩阵的 四则运算 点积
矩阵的转置
代码:
A=np.array([[1,2,3],[3,2,1]])
A
演示:
点积
代码:
#点积
#3x2 * 2x3 = 3x3
ATA = np.dot(A.T,A)
#2x3 * 3x2 = 2x2
np.dot(A,A.T)
演示:
相等形状的矩阵点积
代码:
#相等形状的矩阵点积
np.dot(ATA,z)
演示:
2.6.1full
方法创建
numpy.full用于创建一个自定义形状的数组,可以自己指定一个值,该值填满整个矩阵。
numpy.full(shape,fill_value=num)
结果:
代码:
np.full(shape=(3,3), fill_value=0)
演示:
2.6.2eye
方法创建
numpy.eye 用于创建一个二维数组,其特点是k
对角线上的值为 1
,其余值全部为0
。方法如下:
numpy.eye(N, M=None, k=0, dtype=<type 'float'>)
#k表示从下标第几个开始
其中:
N
:输出数组的行数。M
:输出数组的列数。k
:对角线索引:0(默认)是指主对角线,正值是指上对角线,负值是指下对角线。
举个例子:
代码:
#I 单位矩阵 相当于代数中的1
#首先单位矩阵是一个方阵,
#其次主对角线上的值为1,其它的值为0
#最后,单位矩阵相乘没有先后条件
I = np.eye(3)
I
演示:
代码:
np.dot(ATA,I)
演示:
diag 对角矩阵
代码:
#对角矩阵,主对角线上有值
np.diag([1,2,3])
演示:
上三角矩阵
代码:
#主对角线的又上角有值的,左下角无值
np.diag([1,2,3],k=1)
演示:
稀疏矩阵
代码:
#一个矩阵中有少了的位置是有值的,其它的位置都为0
z1 = np.zeros(shape=(5,4))
z1[1,1] = 100
z1[3,2] = 2
z1
演示:
稠密矩阵
代码:
o1 = np.ones(shape=(5,4))
o1[1,1] = 0
o1[3,2] = 0
o1
演示:
2.7 随机数组抽样
1.生成随机的整数型矩阵
np.random.randint(low=0,high=150,size=(5,4))
- low 表示的是最小值
- high 表示最大值
- size 是一个元组类型或整型
代码:
import random
random.randint(1000,10000)
演示:
代码:
np.random.randint(1000,10000,size=(5,4))
演示:
2. 标准的正态分布(高斯分布)
np.random.randn(10,5)
没有固定的参数,每多加一个数字,代表多真假一个维度
代码:
#一组均值为0,标准差为1的数据
normal = np.random.randn(5,5)
#获取平均值
normal.mean()
#获取标准差
#标准差可以用来检测数据的波动性
normal.std()
plt.hist(normal)
演示:
3.随机抽样
np.random.random(size=(456,730,3))
- size 表示形状
random随即生产的范围是0-1之间
代码:
np.random.random(size=(5,4))
演示:
4.高斯分布
np.random.normal(loc=170,scale=100,size=50)
生成一个一维数组
- location 是定位的的值
- scale 是波动值
- size 是数据长度
代码:
np.random.normal(loc=12500,scale=2500,size=10)
演示:
5.随机数
每一个数据,都是一个维度
rand 和 random 的区别:random 需要 size来描述形状,而rand只需要我们直接给值,通过值的数量来确定形状
np.random.rand(d1,d2,dn)
代码:
np.random.random(size=(5,4))
np.random.rand(5,4)
演示:
2.10 文件 I/O 创建数组
2.10.1 CSV
csv,dat是一种常用的数据格式化文件类型,为了从中读取数据,我们使用
numpy.savetxt()
- fname 存储的路径
- X 代表要呗存储的数据
- delimiter 分割符
代码:
np.savetxt(fname='./demo.csv',X=cat[0],delimiter=',', fmt='%.2f')
np.loadtxt(fname='./demo.csv',delimiter=',')
演示:
2.10.2 Numpy 原生文件类型
使用 numpy.save
与 numpy.load
保存和读取:
代码:
np.save('demo.npy',cat[0])
np.load('demo.npy')
演示:
3、ndarray
数组属性
3.1 ndim,shape,size,dtype
- ndim 数组的维度 (自己会计算)
- shape 形状(5,4,3)
- size 数组的总长度
- dtype 查看数据类型
[[[1, 2, 3],[1, 2, 3],[1, 2, 3]],[[1, 2, 3],[1, 2, 3],[1, 2, 3]],[[1, 2, 3],[1, 2, 3],[1, 2, 3]]]
代码:
cat.ndim
cat.shape
cat.size
cat.dtype
演示:
在定义的时候可以通过dtype来定义数据的类型
怎么修改数据类型?
ndarray.astype()
代码:
cat = cat.astype('int8')
cat.dtype
演示:
3.2 ndarray.T
ndarray.T
用于数组的转置,与 .transpose()
相同。
代码:
cat.shape
cat.T.shape
演示:
3.3ndarray.imag
ndarray.imag
用来输出数组包含元素的虚部。
imaginary number 虚数
代码:
#复数 = 实数 + 虚数
cat.imag
演示:
3.4ndarray.real
ndarray.real
用来输出数组包含元素的实部。
real number 实数
代码:
cat.real
演示:
3.5ndarray.itemsize
ndarray.itemsize
输出一个数组元素的字节数。
代码:
A = np.ones(shape=(5,4),dtype='uint8')
A
#每个元素1只占用1个字节
A.itemsize
演示:
3.6 ndarray.nbytes
ndarray.nbytes
用来输出数组的元素总字节数。
代码:
A.nbytes
演示:
3.7 ndarray.strides
ndarray.strides
用来遍历数组时,输出每个维度中步进的字节元组。
代码:
A.strides
#下标为1的代表每个元素占用1字节
#下标为0的代表每个行向量占用4字节
A
演示:
小笔记
- pip list可以看到现在有什么库
- 图片和音乐读取都是数组
- bytes
1个字节耗费八个比特位
第一位是正负号,
正方向:127
负方向:-128
- float16
半精度类型,不常用,我们常用的是float32
第一个正负数
后面还有31格
再去掉8个
这八个表示科学计数法
最后剩的23个有很多个数值的变化
E8M23表示float32
- 数组的形状shape
- 别忘了shift+tab可以看到函数怎么用
- np.ndarray(shape=(3,3),dtype=‘int8’)随机产生矩阵
- 如果没有写dtype就是默认的8.后面有个点
- jit技术预编译技术 just in time
numpy 数组的点积与矩阵的乘积
1.在Python导入numpy包
2.认识数组的乘积
3.用numpy来举例说明
创建二维数组A和B
二维数组A*B
4.认识矩阵的乘积
5.数组AB用dot函数来作为矩阵的乘积
np.dot(A,B)