2017/03/07
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@author: XiangguoSun
@contact: sunxiangguodut@qq.com
@file: learn_numpy.py
@time: 2017/3/6 15:09
@software: PyCharm
"""
import numpy as np
'''
1 ndarray
'''
data=[[1,2,3],[4,5,6]]#也可以是其他序列类型
arr1=np.array(data)
print arr1,arr1.ndim,arr1.shape,arr1.dtype
print np.zeros((3,)),np.zeros((3,)).ndim,np.zeros((3,)).shape
print np.zeros((3,1)),np.zeros((3,1)).ndim,np.zeros((3,1)).shape
print np.zeros((1,3)),np.zeros((1,3)).ndim,np.zeros((1,3)).shape
print np.zeros(3),np.zeros(3).ndim,np.zeros(3).shape #np.zeros(3)==np.zeros((3,))
print np.ones(3)
print np.empty(3)
print np.ones_like(arr1),np.zeros_like(arr1),np.empty_like(arr1)#shape 为arr1的ndarry
print np.identity(2)#等价于np.eye(2)#创建单位矩阵
'''
2 ndarray和标量运算
大小相同的ndarray之间任何运算都会将运算应用到元素级
ndarray与标量的运算也会将那个标量broadcasting到ndarray的各个元素中
但是,不同大小的数组之间的运算叫做broadcasting。
2.1简单的运算
略
2.2 broadcasing
广播的原则:
如果两个数组的后缘维度的轴长相符或者其中一方长度为1,则认为他们是广播兼容的。
广播会在缺失维度和(或)长度为1的维度上进行。
例如:
1:shape((4,3))+shape((3,))
(4,3)和(3,)的后缘维度为3.因此是广播兼容的。传播方向在缺失维度上进行。
这里 4 vs 缺失, 3 vs 3
因此传播方向沿着0轴
2:shape((4,3))+shape((4,1))
(4,3)和(4,1)的后缘维度为:3 vs 1 因此是广播兼容的。传播方向在
1轴上
试想,如果是(1,4,3)和(4,1)呢?
也是广播兼容的,但是传播方向在0轴和2轴上
3:shape((3,4,2))+shape((4,2))
(3,4,2)和(4,2)的后缘维度是4vs4 2 vs 2.因此是广播兼容的,传播方向在缺失轴0轴
4:shape((1,5,3))+shape((5,3))
后缘维度是 5 vs 5, 3 vs 3因此是广播兼容的,传播方向在缺失轴0轴
'''
#print np.ones((3,4,2))+np.ones((3,4,2))#报错,因为广播不兼容
'''
2 基本的索引和切片
如果你想得到ndarray切片的一份副本而非在源数据上修改,就需要显示地进行复制操作
b=arr[5:8].copy()
否则,单纯地b=arr[5:8]
那么修改b,arr对应的元素也会被修改
很简单,略
'''
'''
3,bool型索引
'''
names=np.array(['bob','bob','david'])
values=np.array([1,2,3])
print values[names == 'bob']#& | -(!),注意python 关键字and or在这里无效
print values[values > 2]
'''
4,花式索引
花式索引与切片不同,它总是将数据复制到新数组中
'''
arr= np.arange(32).reshape((8,4))
print arr
print " "
print arr[[1,5,2,7]]
print arr[[1,5,2,7]]
print arr[[1,5,2,7],[2,1,3,1]]#(1,2),(5,1),(2,3),(7,1)
print arr[[1,5,2,7]][:,[2,1,3,1]]
print arr[np.ix_([1,5,2,7],[2,1,3,1])]
'''
5,数组转置和轴对换
'''
arr= np.arange(15).reshape((3,5))
print arr
print arr.transpose()
print arr.T
print np.dot(arr.T,arr)
arr = np.arange(16).reshape((2,2,4))
print arr
print arr.transpose((1,0,2))#轴序列原本为(0,1,2),现在变成(1,0,2),相当于交换x,y:m[y][x][z]=m[x][y][z]
print arr.swapaxes(1,2)#交换1号轴和2号轴m[x][z][y]=m[x][y][z]
6,通用函数
通用函数执行元素级别运算的函数。作用到每个元素。
7,meshgrid
接受两个一维数组,返回一个平面,这个平面用两个array接受。
```
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@author: XiangguoSun
@contact: sunxiangguodut@qq.com
@file: learn_numpy.py
@time: 2017/3/6 15:09
@software: PyCharm
"""
import numpy as np
import matplotlib.pyplot as plt
points=np.arange(-5,5,0.01)
xx,yy=np.meshgrid(points,points)
z=np.log(np.exp(xx)+np.exp(yy))
z2=np.maximum(xx,yy)
fig = plt.figure()
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
# ax3 = fig.add_subplot(223)
# ax4 = fig.add_subplot(224)
ax1.contourf(xx,yy,z,20)
ax1.set_title("image of $ln( e^{x_1}+e^{x_2} )$")
ax2.contourf(xx,yy,z2,20)
ax2.set_title("image of $max(x_1,x_2 )$")
# ax3.imshow(z)
# ax4.imshow(z2)
plt.show()
'''
8,where
'''
xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
condition = np.array([True,False,True,True,False])
results1= np.where(condition,xarr,yarr)#如果为True,取xarr中的值,否则取yarr
results2=np.where(xarr>1.3,1,0)
print results1,results2
'''
9,数组统计方法
'''
arr=np.random.randn(5,4)
arr.mean()
np.mean(arr)
'''
10,集合逻辑
'''
arr = np.random.randn(100)
print (arr > 0).sum() # 正值的数量
bools = np.array([False, True, False, False])
print bools.any() # 用于测试数组中是否存在一个或多个True
print bools.all() # 用于测试数组中是否都是True
arr.sort(0)#在0轴向上排序,这个是就地排序。np.sort(arr)是创建一个副本
names=np.array(['bob','bob','joe','joe','xi'])
np.unique(names)#去重复并按排序,相当于sorted(set(names))
'''
11,持久化
'''
arr = np.arange(10)
np.save('some_array', arr)
print np.load('some_array.npy')
arr2 = np.arange(5)
np.savez('new_array',a=arr,b=arr2)
arr_dic = np.load('new_array.npz')#该对象会对各个数组进行延迟加载
print arr_dic['a'],arr_dic['b']
np.savetxt('arr.txt',arr)
arr3 = np.loadtxt('arr.txt')#delimiter=,converters=,skiprows=
print arr3
'''
11,线性代数
'''
arr= np.random.rand(9).reshape((3,3))
print arr
print np.diag(arr,k=0)#返回方阵的对角线(k=0)
print np.diag(arr,k=-1),np.diag(arr,k=1),np.diag(arr,k=-2),np.diag(arr,k=2)
arr = np.random.rand(3)
a = np.diag(arr)#将一维数组转换为方阵(非对角线元素为0)
print a,a.shape
print np.trace(arr)#计算对角线元素和(迹)
from numpy.linalg import *
print det(arr) # 计算矩阵行列式
print eig(arr) # 计算特征值和特征向量
print inv(arr) # 计算逆矩阵
print pinv(arr) # 伪逆
print qr(arr) # QR分解
svd(arr)
b=np.array([1,2,3])
print solve(arr,b) # 求方程组 Ax=b
print lstsq(arr,b) # 求方程组 Ax=b最小二乘解
'''
12,随机数
'''
import numpy.random
numpy.random.seed(1)
print numpy.random.permutation([1,2,3,4,5])
print numpy.random.permutation(5)
arr = np.random.randn(3)
print arr
numpy.random.shuffle(arr)
print arr