numpy学习笔记

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

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值