现从一张图片上去认识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 本身更为丰富的数值类型,细分如下:

  1. bool:布尔类型,1 个字节,值为 True 或 False。

  2. int:整数类型,通常为 int64 或 int32 。

  3. intc:与 C 里的 int 相同,通常为 int32 或 int64。

  4. intp:用于索引,通常为 int32 或 int64。

  5. int8:字节(从 -128 到 127) tinyint

    (tinyint 1字节 -2 ^7 ~ 2^7-1 (-128~127))

  6. int16:整数(从 -32768 到 32767) smallint

    (smallint 2字节 -2 ^15 ~ 2^15-1 (-32768~32765))

  7. int32:整数(从 -2147483648 到 2147483647) int

    (int 4字节 -2 ^31~ 2^31-1 (-2147483648~2147483647))

  8. int64:整数(从 -9223372036854775808 到 9223372036854775807) bigint

    (bigint 8字节 -2 ^63 ~ 2^63-1)

  9. uint8:无符号整数(从 0 到 255) unsigned

  10. uint16:无符号整数(从 0 到 65535)

  11. uint32:无符号整数(从 0 到 4294967295)

  12. uint64:无符号整数(从 0 到 18446744073709551615)

  13. float:float64 的简写。

  14. float16:半精度浮点,5 位指数,10 位尾数

  15. float32:单精度浮点,8 位指数,23 位尾数

  16. float64:双精度浮点,11 位指数,52 位尾数

  17. complex:complex128 的简写。

  18. complex64:复数,由两个 32 位浮点表示。

  19. 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) 
  1. 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.savenumpy.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

演示:

小笔记

  1. pip list可以看到现在有什么库
  2. 图片和音乐读取都是数组
  3. bytes
    1个字节耗费八个比特位

    第一位是正负号,
    正方向:127
    负方向:-128
  4. float16
    半精度类型,不常用,我们常用的是float32
    第一个正负数
    后面还有31格
    再去掉8个
    这八个表示科学计数法

    最后剩的23个有很多个数值的变化
    E8M23表示float32
  5. 数组的形状shape
  6. 别忘了shift+tab可以看到函数怎么用
  7. np.ndarray(shape=(3,3),dtype=‘int8’)随机产生矩阵
  8. 如果没有写dtype就是默认的8.后面有个点
  9. jit技术预编译技术 just in time

numpy 数组的点积与矩阵的乘积

1.在Python导入numpy包

2.认识数组的乘积

3.用numpy来举例说明

创建二维数组A和B

二维数组A*B

4.认识矩阵的乘积

5.数组AB用dot函数来作为矩阵的乘积

np.dot(A,B)