Numerical Python(数值化的python)
- 1.numpy在内存运算上占有优势,核心数据类型叫做ndarray (n dimension array)
- 2.使用数组管理内存
- 3.numpy是一个并行计算的库(高密计算),不是直接由python进行封装的,是c语言封装的一个python库,它没有GIL锁.
- 4.numpy是python人工智能的基础库.其它的库都依赖于numpy.
numpy中的数据类型¶
python中有自己的数据类型.
numpy中的数据类型相对于python来说,更加的细致
- 1.bool:布尔 , 1 字节
- 2.int :整数类型,代表的是int64. (bigint 8字节)
- 3.intc: int32 (int 4个字节)
- 4.intp:只用于索引,int64
- 5.int8:(tinyint 1个字节)
- 6.int16:(smallint 2字节)
- 7.int32:(int 4个字节)
- 8.int64:(bigint 8个字节)
- 9.float:float64
- 10.float16 : 半精度
- 11.float32 : 单精度
- 12.float64 : 双精度
- 13.complex : complex128
- 14.complex64:由两个32的浮点数组成的
- 15.complex128:由两个64的浮点数组成的
- 16.uint8 : 无符号的整数
- 17.uint16 : 无符号的整数
- 18.uint32 : 无符号的整数
- 19.uint64 : 无符号的整数
- 20.时间序列
In [2]:
#anaconda中自带numpy
#如果要自己安装的话,解决依赖关系
import numpy as np
import matplotlib.pyplot as plt
In [3]:
lj = plt.imread('onr.jpg')
#在jupyter中如果不使用输出函数,那么最后一个变量会默认调用display()
plt.imshow(lj)
Out[3]:
<matplotlib.image.AxesImage at 0x279508f14e0>
numpy中的名词(线代中的名称)
- 1.一个整数 : 标量 纯量
- 2.一维的数组 : 向量 矢量
- 3.二维的数组 : 矩阵
- 4.三维及其以上 : 张量
使用ndarray保存数据
数据库有瓶颈 MySQL IO操作的时候带来的
ndarray在速度上是一个整体存储的空间
In [30]:
#将其它的序列类型转变为ndarray类型
np.array('abc')
Out[30]:
array('abc', dtype='<U3')
In [25]:
np.array([1,2,3,4,5])[0]
Out[25]:
1
In [26]:
np.array((1,2,3,4,5))[0]
Out[26]:
1
In [28]:
#set类型是序列?不是
#无序的类型可以强制转换,但是不能使用
np.array({1,2,3,4,5})
Out[28]:
array({1, 2, 3, 4, 5}, dtype=object)
In [33]:
np.array({'a':1,'b':2})
Out[33]:
array({'a': 1, 'b': 2}, dtype=object)
In [34]:
#对于可迭代类型
np.array(range(10))
Out[34]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
引用传地址
但是引用传地址在ndarray中不能正常的使用
In [40]:
li_ = [1,2,3,4,5]
In [41]:
nd1 = np.array(li_)
In [42]:
display(li_,nd1)
[1, 2, 3, 4, 5]
array([1, 2, 3, 4, 5])
In [43]:
li_[0] = 0
In [44]:
display(li_,nd1)
[0, 2, 3, 4, 5]
array([1, 2, 3, 4, 5])
In [45]:
#拷贝传值
a=1
b=a
a=2
display(a,b)
2
1
In [46]:
#引用传地址
l1=[1,2,3]
l2=l1
l1[0] = 10
display(l1,l2)
[10, 2, 3]
[10, 2, 3]
ndarray的数据保存
In [51]:
# name sex age idCard
#当前的数据是 4x4的矩阵 = 方阵
sign = np.array(['name','sex','age','idCard'])
arr = np.array([
['tom','male',18,123456],
['jack','male',18,123456],
['liye','male',18,123456],
['lijing','male',18,123456],
])
In [52]:
sign
Out[52]:
array(['name', 'sex', 'age', 'idCard'], dtype='<U6')
In [48]:
arr
Out[48]:
array([['tom', 'male', '18', '123456'],
['jack', 'male', '18', '123456'],
['liye', 'male', '18', '123456'],
['lijing', 'male', '18', '123456']], dtype='<U6')
ndarray的随机值
low 范围的最小值
high 范围的最大值
size 数组的形状
dtype 数据类型
In [85]:
#2行3列 tinyint uint8 0-255
# np.random.randint(-1000,1000,size=(2,3),dtype='uint8').itemsize
np.random.randint(-1000,1000,size=(2,3),dtype=int).itemsize
Out[85]:
8
#随机小数
#size 形状
In [90]:
np.random.random((5,5))
Out[90]:
array([[0.9710657 , 0.59959458, 0.17277926, 0.7564499 , 0.8199467 ],
[0.05728386, 0.43645809, 0.55643072, 0.24820215, 0.64320721],
[0.83246593, 0.46085084, 0.59217745, 0.64244586, 0.46066542],
[0.73132308, 0.17251823, 0.92862237, 0.13484279, 0.94449531],
[0.38324227, 0.21124364, 0.10590877, 0.85026129, 0.63822026]])
#randn 是生成一个 标准的正态分布的数组 , 中间值是0 均值是0 标准差值为1
#什么是正态分布?高斯分布
d0, d1, ..., dn 代表的是多少维度
In [95]:
np.random.randn(5,3)
Out[95]:
array([[-0.62357575, 1.15439985, -1.65257655],
[ 1.97774917, -0.05774362, -0.77469661],
[-1.65905117, -1.24069957, 0.87832254],
[ 0.07512725, 0.00605548, 0.02697345],
[ 0.22584547, 1.48109243, -1.10517901]])
#rand 只是用来生成一个随机的浮点数的
In [100]:
np.random.rand(5,3)
Out[100]:
array([[0.32596556, 0.16245572, 0.39403561],
[0.11270325, 0.83104786, 0.77568375],
[0.58643552, 0.26710588, 0.4707389 ],
[0.43680775, 0.37349157, 0.41696032],
[0.39967651, 0.69804483, 0.82111621]])
#normal 生成一个自定义正太分布的数组
loc=0.0 location 定位 中值
scale=1.0 波动
size=None 数组的形状
超过波动范围的值是异常值
In [101]:
np.random.normal(100,10,10)
Out[101]:
array([ 97.1131475 , 107.82816673, 99.37605262, 104.48124786,
110.60289338, 95.01571761, 100.66840617, 103.5317543 ,
85.9189614 , 92.54307587])
ndarray的属性
- ndarray.shape 数组的形状
- ndarray.ndim 数组的维度
- ndarray.size 数组中元素的数量
- ndarray.dtype 数组的数据类型
- ndarray.itemsize 一个数组占用的字节数
- ndarray.T 转制矩阵
- ndarray.real 读取实数部分
- ndarray.imag 读取虚数部分
- ndarray.nbytes 用来计算数组的元素占用字节的总和
- ndarray.strides 逐步输出数组占用的字节数
In [102]:
A = np.array([[1,2,3],[7,8,9]])
A
Out[102]:
array([[1, 2, 3],
[7, 8, 9]])
In [103]:
A.T
Out[103]:
array([[1, 7],
[2, 8],
[3, 9]])
In [107]:
np.dot(A.T,A)
Out[107]:
array([[50, 58, 66],
[58, 68, 78],
[66, 78, 90]])
# real imag
In [110]:
res = np.full(shape=(2,3),fill_value=0.123+0.345j)
In [114]:
res.real
Out[114]:
array([[0.123, 0.123, 0.123],
[0.123, 0.123, 0.123]])
In [116]:
res.imag
Out[116]:
array([[0.345, 0.345, 0.345],
[0.345, 0.345, 0.345]])
#nbytes
In [126]:
o = np.ones(shape=(3,5),dtype=np.int8)
In [127]:
o
Out[127]:
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=int8)
In [128]:
o.shape
Out[128]:
(3, 5)
In [129]:
o.nbytes
Out[129]:
15
In [130]:
o.dtype
Out[130]:
dtype('int8')
In [133]:
#对原数据不产生影响
o = o.astype(np.float)
#strides
In [139]:
z = np.zeros(shape=(4,3))
z
Out[139]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
In [140]:
z.itemsize
Out[140]:
8
In [141]:
z.nbytes
Out[141]:
96
In [142]:
#8指的是每一个元素所占用的字节数
#32 指的是行向量所占用的字节数
z.strides
Out[142]:
(24, 8)
np中的函数
- np.dot() 矩阵乘法
- np.full() 使用某一个制定的值填满数组
- np.ones() 生成一个元素全部为1的数组
- np.astype() 改变数组的数据类型
- np.zeros() 生成一个元素全部为0的数组,如果生成的维度是二维的,那么这是一个'零矩阵'(相当于代数中0)
- np.diag() 对角矩阵,主对角线上是有值,其它地方没有值
- np.eye() I 单位矩阵,(相当于线代中的 1),主对角线上的值为1,其它的地方为0
In [161]:
#N 是 阶
#k = 2 代表对角线向上偏移两格位置
#k = -1 代表对角线向下偏移一格位置
I = np.eye(3)
I
Out[161]:
array([[0., 0., 0.],
[0., 0., 0.],
[1., 0., 0.]])
In [146]:
A = np.random.randint(1,10,(3,3))
A
Out[146]:
array([[4, 9, 7],
[4, 6, 5],
[9, 6, 5]])
In [148]:
np.dot(I,A)
Out[148]:
array([[4., 9., 7.],
[4., 6., 5.],
[9., 6., 5.]])
In [156]:
#v 代表对角线上的值,这个值必须是一个向量
np.diag([1,0.5,0.3])
Out[156]:
array([[1. , 0. , 0. ],
[0. , 0.5, 0. ],
[0. , 0. , 0.3]])
三角矩阵 上三角 下三角
In [168]:
a = np.eye(3,k=-2)
a
Out[168]:
array([[0., 0., 0.],
[0., 0., 0.],
[1., 0., 0.]])
In [167]:
b = np.eye(3,k=-1)
b
Out[167]:
array([[0., 0., 0.],
[1., 0., 0.],
[0., 1., 0.]])
In [166]:
c = np.eye(3)
c
Out[166]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
In [169]:
a+b+c
Out[169]:
array([[1., 0., 0.],
[1., 1., 0.],
[1., 1., 1.]])
稀疏矩阵 希松 松散
大部分的值是0,小部分的位置有其它值的
文本处理
In [171]:
np.array([[0,0,0,1],[0,0,0,0],[0,2,0,0],[0,0,0,0]])
Out[171]:
array([[0, 0, 0, 1],
[0, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 0, 0]])
numpy 中的聚合函数
- np.sum() 求和
- np.mean() 均值
- np.max() 最大值
- np.min() 最小值
axis参数 轴
axis = 0 行合并 y
axis = 1 列合并 x
In [177]:
np.ones(shape=(4,5)).sum(axis=1)
Out[177]:
array([5., 5., 5., 5.])
In [182]:
A = np.random.randint(1,10,(4,5))
A
Out[182]:
array([[6, 4, 4, 8, 3],
[9, 1, 7, 6, 8],
[8, 6, 9, 9, 2],
[4, 2, 3, 2, 6]])
In [185]:
np.mean(A,axis=-1)
Out[185]:
array([5. , 6.2, 6.8, 3.4])
使用聚合函数进行图片的灰度化
In [196]:
#3 rgb
lj.shape
Out[196]:
(483, 483, 3)
In [4]:
#黑白图片 还是二维的 透光率 jpg 0-255 png 0-1
#需要降低维度
#np.sum() ndarray.sum()
#color map
#bug jpg 0-255 [243,200,220]
plt.imshow(lj.sum(axis=2),cmap='gray')
Out[4]:
<matplotlib.image.AxesImage at 0x27950987588>
In [5]:
plt.imshow(lj.max(axis=-1),cmap='gray')
Out[5]:
<matplotlib.image.AxesImage at 0x279509e4400>
In [6]:
plt.imshow(lj.min(axis=-1),cmap='gray')
Out[6]:
<matplotlib.image.AxesImage at 0x27950a403c8>
In [7]:
plt.imshow(lj.mean(axis=-1),cmap='gray')
Out[7]:
<matplotlib.image.AxesImage at 0x27950bcef60>
In [ ]:
In [ ]:
In [8]:
plt.imshow(lj)
Out[8]:
<matplotlib.image.AxesImage at 0x27950aa7940>
In [12]:
plt.imshow(lj[0:300,60:280])
Out[12]:
<matplotlib.image.AxesImage at 0x27951d5ab70>
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]: