python的numpy库

numpy(Numerical Python)提供了python对多维数组对象的支持:ndarray,具有矢量运算能力,快速、节省空间。numpy支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

NumPy 是非常有名的Python 科学计算工具包,其中 包含了大量有用的思想,比如数组对象(用来表示向量、矩阵、图像等)以及线性 代数函数。数组对象可以帮助你实现数组中重要的操作,比如矩阵乘积转置解方程系统向量乘积归一化,这为图像变形对变化进行建模图像分类图像聚类等提供了基础。

1

2

from PIL import Image
import numpy as np

a = np.array(Image.open('1.jpg').convert('L'))
print(a.shape, a.dtype)
# b = (100/255)*a +150
b = 255 * (a/255)**2 # 图像的灰度很重

im = Image.fromarray(b.astype('uint8'))
im.save('2.jpg')

varto

transfor

# # 相片变为手绘效果图片
# # 黑白灰色 & 便捷线条较重 & 相同或相近色彩趋于白色 & 略有光源效果
# 梯度和虚拟深度值对图像进行重构


from PIL import Image
import numpy as np

name = input("please input your jpg Path: ")

a = np.asarray(Image.open(name).convert('L')).astype('float')    # convert('L')灰度图片

depth = 10.  # (0-100)
grad = np.gradient(a)  # 取图像灰度的梯度值
grad_x, grad_y = grad  # 分别取横纵图像梯度值
grad_x = grad_x * depth / 100.
grad_y = grad_y * depth / 100.
A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
uni_x = grad_x / A
uni_y = grad_y / A
uni_z = 1. / A

vec_el = np.pi / 2.2  # 光源的俯视角度,弧度值
vec_az = np.pi / 4.  # 光源的方位角度,弧度值
dx = np.cos(vec_el) * np.cos(vec_az)  # 光源对x 轴的影响
dy = np.cos(vec_el) * np.sin(vec_az)  # 光源对y 轴的影响
dz = np.sin(vec_el)  # 光源对z 轴的影响

b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)  # 光源归一化
b = b.clip(0, 255)  # 为避免数据越界,将生成的灰度值裁剪至0-255区间

im = Image.fromarray(b.astype('uint8'))  # 重构图像
im.save("images/new_name.jpg")

如何批量生成素描文件,这里写了一个for循环即可解决问题.

from PIL import Image
import numpy as np
import os

# 传入的一个是文件全路径,一个是获取文件名称
def generate(name, txt):
    a = np.asarray(Image.open(name).convert('L')).astype('float')  # convert('L')灰度图片
    depth = 10.  # (0-100)
    grad = np.gradient(a)  # 取图像灰度的梯度值
    grad_x, grad_y = grad  # 分别取横纵图像梯度值
    grad_x = grad_x * depth / 100.
    grad_y = grad_y * depth / 100.
    ax = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / ax
    uni_y = grad_y / ax
    uni_z = 1. / ax
    vec_el = np.pi / 2.2  # 光源的俯视角度,弧度值
    vec_az = np.pi / 4.  # 光源的方位角度,弧度值
    dx = np.cos(vec_el) * np.cos(vec_az)  # 光源对x 轴的影响
    dy = np.cos(vec_el) * np.sin(vec_az)  # 光源对y 轴的影响
    dz = np.sin(vec_el)  # 光源对z 轴的影响
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)  # 光源归一化
    b = b.clip(0, 255)  # 为避免数据越界,将生成的灰度值裁剪至0-255区间
    im = Image.fromarray(b.astype('uint8'))  # 重构图像
    im.save("images/" + txt[-1])

# 获取当前目录下的所有以jpg结尾的文件
def get_files(path='D:\\text', rule=".jpg"):
    allfile = []
    for fpathe, dirs, fs in os.walk(path):  # os.walk是获取所有的目录
        for f in fs:
            filename = os.path.join(fpathe, f)
            if filename.endswith(rule):  # 判断是否是"xxx"结尾
                allfile.append(filename)
    return allfile

# 入口函数
if __name__ == "__main__":
    b = get_files(r"D:\text")
    for i in b:
        txt = i.split("\\")
        generate(i, txt)

python的matplotlib库

简单来说,Matplotlib 是 Python 的一个绘图库。它包含了大量的工具,你可以使用这些工具创建各种图形,包括简单的散点图,正弦曲线,甚至是三维图形。Python 科学计算社区经常使用它完成数据可视化的工作。

很容易画出一张图

yuxuan

import numpy as np
import matplotlib.pyplot as plt

def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)

a = np.arange(0.0, 5.0, 0.02)
plt.subplot(211)
plt.plot(a, f(a))
plt.subplot(212)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.savefig('images/yuxuan', dpi=600)
cn_matp
plt.plot(x, y, format_string, **kwargs): xx轴数据,可为列表或数组;y同理;format_string 为控制曲线的格式字符串, **kwargs 第二组或更多的(x, y,format_string 

format_string:  颜色字符、风格字符和标记字符组成。 
    颜色字符:‘b’蓝色 ;‘#008000RGB某颜色;‘0.8’灰度值字符串 
    风格字符:‘-’实线;‘–’破折线; -.’点划线; ‘:’虚线  ‘’‘’无线条 
    标记字符:‘.’点标记 o 实心圈 v’倒三角 ^’上三角

rcParams 的属性
    font.family 用于显示字体的名字 'SimHei'\ 'Kaiti'
    font.style  字体风格,'normal'或者 'italic'
    font.size    字体大小, 'large' 或者'x-small'
    fontproperties fontsize
plt.xlabel():对x轴增加文本标签
plt.ylabel():同理
plt.text(): 在任意位置增加文本
plt.title(2,1,r'$\mu=100$') 对图形整体增加文本标签,2,1为横轴坐标轴。
plt.annotate() 在图形中加入注解
plt. annotate(s, xy = arrow_crd, xytext = text_crd, arrowprops = dict)  

在图形中加中文注解,正式的余弦函数如下:

cn_matp

cn_matp

import numpy as np
import matplotlib.pyplot as plt

# import matplotlib

# matplotlib.rcParams['font.family']='SimHei'
# matplotlib.rcParams['font.size']=20

a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴: 时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴: 振幅', fontproperties='SimHei', fontsize=15)

plt.title(r'余弦波实例$y=cos(2\pi x)$', fontproperties='SimHei', fontsize=25)
# plt.text(2, 1, r'$\mu=100$',fontsize=15)    # 
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),
             arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)

plt.savefig('images/cn_matp_arrow', dpi=600)
plt.plot(x,y , fmt) :绘制坐标图 
plt.boxplot(data, notch, position): 绘制箱形图 
plt.bar(left, height, width, bottom) : 绘制条形图 
plt.barh(width, bottom, left, height) : 绘制横向条形图 
plt.polar(theta, r) : 绘制极坐标图 
plt.pie(data, explode) : 绘制饼图 
plt.scatter(x, y) :绘制散点图 
plt.hist(x, bings, normed) : 绘制直方图

python的pandas库

Pandas 是基于 NumPy 的一个非常好用的库,正如名字一样,人见人爱。之所以如此,就在于不论是读取、处理数据,用它都非常简单。

Pandas 有两种自己独有的基本数据结构。读者应该注意的是,它固然有着两种数据结构,因为它依然是 Python 的一个库,所以,Python 中有的数据类型在这里依然适用,也同样还可以使用类自己定义数据类型。只不过,Pandas 里面又定义了两种数据类型:Series 和 DataFrame,它们让数据操作更简单了。

这种样式我们已经熟悉了,不过,在有些时候,需要把它竖过来表示:

index data
0 9
1 3
2 8
- Dateframe类型

DataFrame 是一种二维的数据结构,非常接近于电子表格或者类似 mysql 数据库的形式。它的竖行称之为 columns,横行跟前面的 Series 一样,称之为 index,也就是说可以通过 columns 和 index 来确定一个主句的位置。

# series 类型会自动对齐索引,且基于索引, 补齐后运算, 运算默认产生浮点数.
import pandas as pd
import numpy as np

a = pd.DataFrame(np.arange(12).reshape(3, 4))
b = pd.DataFrame(np.arange(20).reshape(4, 5))
c = a.mul(b, fill_value=0)
d = pd.Series(np.arange(4))
print(c)
print(d-10)
print(b-d)

# optput:
#      0     1      2      3    4
# 0   0.0   1.0    4.0    9.0  0.0
# 1  20.0  30.0   42.0   56.0  0.0
# 2  80.0  99.0  120.0  143.0  0.0
# 3   0.0   0.0    0.0    0.0  0.0
# 0   -10
# 1    -9
# 2    -8
# 3    -7
# dtype: int32
#       0     1     2     3   4
# 0   0.0   0.0   0.0   0.0 NaN
# 1   5.0   5.0   5.0   5.0 NaN
# 2  10.0  10.0  10.0  10.0 NaN
# 3  15.0  15.0  15.0  15.0 NaN
import pandas as pd

d1 = {'城市': ['北京', '上海', '深圳'],
     '环比': [101.5, 101.2, 103.6],
     '同比': [110.2, 113.8, 115.3]}
d = pd.DataFrame(d1, index=['c1', 'c2', 'c3'])
nd = d.drop('c1')

print(nd)
# output: 
#     城市     环比     同比
# c2  上海  101.2  113.8
# c3  深圳  103.6  115.3
import pandas as pd
import numpy as np

# 排序,有索引和数值排序

b = pd.DataFrame(np.arange(20).reshape(4, 5), index=['c', 'a', 'b', 'd'])
# print(b)
#
# print(b.sort_index())
# print(b.sort_index(ascending=False))
# print(b.sort_index(axis=1, ascending=False))
# print(b.sort_values(2, ascending=False))

# cumsum:就是当前列之前的和加到当前列上
c = b.cumsum(axis=0)
print(b)
print(c)
# print(b.describe().ix['max'])

# output:
#     0   1   2   3   4
# c   0   1   2   3   4
# a   5   6   7   8   9
# b  10  11  12  13  14
# d  15  16  17  18  19
#     0   1   2   3   4
# c   0   1   2   3   4
# a   5   7   9  11  13
# b  15  18  21  24  27
# d  30  34  38  42  46

这里有协方差公式:

$$cov(X,Y) =E[X-E[X]]E[Y-E[Y]]=E[X*Y] - E[X]E[Y]$$

pearson相关系数:

因为$\mu _{X}=E(X)$;

$\sigma_{X}^{2}=E(X^{2})-E^{2}(X)$

同样地,对于$Y$,可以写成:

$$\rho _{X,Y}={\frac {E(XY)-E(X)E(Y)}{{\sqrt {E(X^{2})-E^{2}(X)}}~{\sqrt {E(Y^{2})-E^{2}(Y)}}}}$$

# cov()函数:协方差 
# corr()函数: pearson相关系统函数。

import pandas as pd

# 房价增幅与m2增幅的相关性。
hprice = pd.Series([3.04, 22.93, 12.75, 22.6, 12.33], index=['2008','2009', '2010', '2011', '2012'])
m2 = pd.Series([8.18, 18.38, 9.13, 7.82, 6.69], index=['2008','2009', '2010', '2011', '2012'])

r1 = hprice.corr(m2)
print(r1)

# output:
# 0.5239439145220387

参考