一、Numpy学习笔记

1.numpy库概述

       numpy库是Python语言的第三方库,numpy现已成为科学计算事实上的标准库。

       numpy库处理的最基础数据类型是由同种元素构成的多维数组(ndattay),简称“数组”。

数组中所有元素的类型必须相同,数组中元素可以用整数索引,序号从0考试。ndarray类型的维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。一维数组的秩为1,二维数组的秩为2,二维数组相当于由两个一位数组构成。

       由于numpy库中函数较多且命名容易与常用命名混淆,建议采用如下方式引用numpy库:

import numpy as np

2.1 创建ndarray

函数

说明

array

输入数据转换为ndarray对象,可以是python元组、列表或其他序列类型。可以自动识别dtype,或者手动指定类型

asarray

将输入数据转换为ndarray对象

arange

类似range,返回ndarray的一维序列数组

ones,ones_like

创建全1数组,默认float类型。ones_like创建一个类型输入数组的全1数组

zeros,zeros_like

与ones相同,创建全0数组

empty,empty_like

全空数组,只分配内存空间,不填充任何值

eye、identity

创建一个n*n的单位矩阵(阵列)

 

 

 

 

 

 

 

 

In [1]: import numpy as np
In [2]: np.arange(10)
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [3]: np.array([1,2,3,5,6,7])
Out[3]: array([1, 2, 3, 5, 6, 7])

In [4]: np.ones((3,1))
Out[4]:
array([[ 1.],
       [ 1.],
       [ 1.]])

In [5]: np.zeros((2,5))
Out[5]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

In [6]: np.eye(3)
Out[6]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

In [7]: np.empty((2,4))
Out[7]:
array([[  0.00000000e+000,   0.00000000e+000,   2.12267575e-314,
          2.19986168e-314],
       [  2.15551710e-314,   2.19976181e-314,   2.31584192e+077,
          5.56268597e-309]]

2.2 ndarray数据类型

ndarry数组相关的数据类型

In [1]: import numpy as np

In [5]: a = np.array([1,2,4],dtype="int32")

In [6]: b = np.array([1,3,5],dtype=np.float32)

In [9]: a.dtype
Out[9]: dtype('int32')

In [10]: b.dtype
Out[10]: dtype('float32')

当需要控制数据在内存和磁盘中的存储方式时,尤其是大数据集,就需要了解如何控制存储类型。
dtype的表示形式有几种:

a.类型列中的值,使用字符串方式:如“int8”;

b.类型列中的值,使用如np.int8表示;

c.类型代码列中的值,使用字符串表示,如“f2”

二、matplotlib读书笔记

matplotlib.pyplot库概述

     matplotlib.pyplot是matplotlib的子库,引用方式如下:

import matplotlib.pyplot as plt

     上述语句与import matplotlib.pyplot一致,as保留字与import一起使用能够改变后续代码中库的命名空间,有助于提高代码可读性。

1、基本图形绘制

x=np.linspace(-1,1,50)#(-1,1)的50个点
y=2*x+1
plt.plot(x,y)

2、figure的使用

x=np.linspace(-1,1,50)#(-1,1)的50个点
y1=2*x+x**5
y2=34*x+np.sin(x**2)
plt.figure()
plt.plot(x,y1)
plt.figure(num=3,figsize=(8,5))  #num用来之星figure的数字,figsize用来制定figure的大小
l1=plt.plot(x,y2,label='a')                  #在一个figure中同时显示两条线
l2=plt.plot(x,y1,label='b')

3、坐标轴显示

plt.xlim((-1,2))  #设置x轴的取值范围
plt.ylim((-1,2))  #设置y轴的取值范围
plt.xlabel('This is X')  #设置坐标轴描述
plt.ylabel('This is Y')
new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)  #更换角标
plt.yticks([-2,-1.8,-1],['$really_bad$','$bad$','$normal$','$good$']) #更改角标为文字,在文字前后加$表示输出为数学字体(空格使用_代替)
#想打出alpha,则需要加上 //alpha
ax=plt.gca() #gca='get current axis' 获得坐标轴
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')   #删除指定位置的框线
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0))   #平移坐标轴
ax.spines['left'].set_position(('data',0))

4、图例

 

plt.legend(handles=[l1,l2],labels=['aaa','bbb'],loc='best')

 

5.注释

 

plt.figure()
x3=np.linspace(-1,1,50)#(-1,1)的50个点
y3=x+1
x0=1
y0=x0+1
plt.scatter(x0,y0,s=50,color='b')
# plt.plot([x0,x0],[y0,0],'k--',lw=2.5)
# plt.annotate(r'$2x+1=3')% y0,xy(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset point'

 

6、散点图——scatter

n=1024
X=np.random.normal(0,1,n)
Y=np.random.normal(0,1,n)
T=np.arctan2(X,Y) #for color value
plt.scatter(X,Y,s=75,c=T,alpha=0.5)
plt.xlim((-1.5,1.5))
plt.ylim((-1.5,1.5))

 7、条形图——bar

plt.figure()
n=10
X=np.arange(n)
Y1=(1-X/float(n)*np.random.uniform(0.5,1.0,n))
Y2=(1-X/float(n)*np.random.uniform(0.5,1.0,n))
plt.bar(X,+Y1)    #使用bar打印出条形图
plt.bar(X,-Y2)
for x,y in zip(X,Y1):  #给每个条形图增加数字描述
    plt.text(x,y+0.05,'%.2f'%y,ha='center',va='bottom')   
for x,y in zip(X,Y2):
    plt.text(x,-y+0.05,'%.2f'%y,ha='center',va='bottom')

8、等高线图

plt.figure()
def f(x,y):
    return(1-x/2+x**5+y**3)*np.exp(-x**2-y**2)
n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y) #把x,y绑定为网格输入值
plt.contourf(X,Y,f(X,Y),10,alpha=0.75,linewidth=0.5)  
C=plt.contour(X,Y,f(X,Y),10,alpha=0.75,linewidth=0.5) 
plt.clabel(C,inline=True,fontsize=10)   #增加数字标识

9、绘制3d图像

fig=plt.figure()
ax=Axes3D(fig)
#输入x,y的值
X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
#生成坐标空间
X,Y=np.meshgrid(X,Y)
R=np.sqrt(X**2+Y**2)
Z=np.sin(R)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('plasma'))
ax.contourf(X,Y,Z,zdir='z',offset=-1.5,cmap='plasma')    #打印等高线

10、在一个窗口中显示多个图像——subplot

plt.figure()
plt.subplot(2,2,1)  #改变subplot的显示区域(行,列,该图所在的区域)
plt.plot([0,1],[0,1])
plt.subplot(2,2,2)
plt.plot([0,1],[0,2])
plt.subplot(2,2,3)
plt.plot([0,1],[0,2])
plt.subplot(2,2,4)
plt.plot([0,1],[0,2])
# 改变图像的大小(非均匀分布)
plt.figure()
plt.subplot(2,1,1)  #改变subplot的显示区域(行,列,该图所在的区域) 独占一行
plt.plot([0,1],[0,1])
plt.subplot(2,3,4)   #剩下三个占一行,数字标记按最小单位计算(独占第一行为3个单位,下一行从第4个数起)
plt.plot([0,1],[0,2])
plt.subplot(2,3,5)
plt.plot([0,1],[0,2])
plt.subplot(2,3,6)
plt.plot([0,1],[0,2])

11、次坐标

x=np.arange(0,10,0.1)
y1=0.05*x**2
y2=-1*y1
fig,ax1=plt.subplots()  #定义次坐标轴
ax2=ax1.twinx()
ax1.plot(x,y1,'g-')
ax2.plot(x,y2,'b--')
ax1.set_xlabel('X data')
ax1.set_ylabel('Y1',color='g')
ax1.set_ylabel('Y2',color='b')

12、添加动画

from matplotlib import animation #引入动画模块
fig,ax=plt.subplots()
x=np.arange(0,2*np.pi,0.01)
line,=ax.plot(x,np.sin(x))  #line初始化输出为列表,想要第一位则需要加一个逗号
def animation_1(i):
    line.set_ydata(np.sin(x+i/10))
    return line,
def init():
    line.set_ydata(np.sin(x))
    return line,
ani=animation.FuncAnimation(fig=fig,func=animation_1,frames=100,init_func=init,interval=20,blit=False)
plt.show()

三、python123雷达图

python nc文件 numpy 维度 numpy的维度称为()_坐标轴

四、自定义手绘风

实例代码:

 

from PIL import Image
import numpy as np
vec_el = np.pi/2.2 # 光源的俯视角度,弧度值
vec_az = np.pi/4. # 光源的方位角度,弧度值
depth = 10. # (0-100)
im = Image.open('fcity.jpg').convert('L')
a = np.asarray(im).astype('float')
grad = np.gradient(a) #取图像灰度的梯度值
grad_x, grad_y = grad #分别取横纵图像梯度值
grad_x = grad_x*depth/100.
grad_y = grad_y*depth/100.
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 轴的影响
A = np.sqrt(grad_x**2 + grad_y**2 + 1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
a2 = 255*(dx*uni_x + dy*uni_y + dz*uni_z) #光源归一化
a2 = a2.clip(0,255)
im2 = Image.fromarray(a2.astype('uint8')) #重构图像
im2.save('fcityHandDraw.jpg')

 

原图:

python nc文件 numpy 维度 numpy的维度称为()_坐标轴_02

 

效果如下图:

python nc文件 numpy 维度 numpy的维度称为()_数组_03