AI人工智能学习之旅人工智能时代(AI)我爱编程

2.科学计算库之Numpy

2017-12-25  本文已影响55人  瓦雷

一、什么是Numpy

numpy主要用来处理同类型数据的多维数组,里面所有的元素必须是同一类型, 如果不是的话,会自动的向下进行转换。在numPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。

二、使用

1.基本操作
1.导入numpy库
import numpy as np

2.将list转为ndarray类型
array = np.array([1,2,3,4,5])
print (type(array))
输出为:<class 'numpy.ndarray'>

3.使用array运算+1
array2 = array + 1
print(array2)
输出:[2 3 4 5 6] 所有元素都会做一遍+1运算

4.取值:array2[0]

5.数组各维的大小tuple类型,对一个n行m列的矩阵来说, shape 为 (n,m)
array2.shape()
输出:(5,)

6.每个元素占用的字节数
array.itemsize 

7.每个元素的类型,可以是 numpy.int32, numpy.int16, and numpy.float64 等
array.dtype疑问为什么int类型有时候输出32有时候输出64

8.函数生成的数组的元素按照等比数列排布,类似于 range函数
arange(10,30,5)
输出:array([10, 15, 20, 25])  

9.array.size: 统计所有元素的个数
10.array.ndim: 数组的维数,也称为rank
11.array.fill(0): 填充矩阵中的值,会将矩阵中的所有值都置为0
12.array.data: 指向数据内存
13.索引与切片:跟Python都是一样的 都是从0开始的

2.数值计算
原始数据:
import numpy as np
tang_array = np.array([[1,2,3],[4,5,6]])
tang_array
输出:
array([[1, 2, 3],
       [4, 5, 6]])

1.求和
*所有元素求个
np.sum(tang_array)

*指定要进行的操作是沿着什么轴(维度)
  #横向求和
  np.sum(tang_array,axis=0)
  输出:array([5, 7, 9])

  #纵向
  np.sum(tang_array,axis=1)
  输出:array([ 6, 15])

2.求积
*所有元素求积
tang_array.prod()

*指定要进行的操作是沿着什么轴(维度)
  #纵向求积
 tang_array.prod(axis = 0)
  输出:array([ 4, 10, 18])

  #横向
  tang_array.prod(axis = 1)
  输出:array([  6, 120])

3.求最小值,使用min()函数

4.求矩阵中所有的元素最小值的索引
  array.argmin() 输出:0 该位置就是所有矩阵元素中的最小值索引

  横向(x轴)位置最小索引
  array.argmin(axis=0)

  纵向(y轴)位置最小索引
  array.argmin(axis=1)

5.求矩阵中所有的元素的平均值 
  array.mean()

  横向(x轴)位置平均值
  array.mean(axis=0)

  纵向(y轴)位置平均值
  array.mean(axis=1)

6.方差
array.var()
array.clip(2,4):将小于2的值都变成2,大于4的值都变成4
array.round():四舍五入
array.round(decimals=1):指定精度,小数点后几位进行四舍五入

7.标准差
array.std()
array.std(axis = 1)
array.std(axis = 0)
3、排序
1.np.sort(array):默认排序axis = 1
指定排序方向:np.sort(tang_array,axis = 0)

2.np.argsort(array):进行排序之后每个元素应该所处的位置的索引值

3.需求:将3个值有序的插入到list列表中
np.linspace(0,10,10):0-10之间取出相等间隔的10个值
tang_array = np.linspace(0,10,10)
输出:array([  0.        ,   1.11111111,   2.22222222,   3.33333333,
         4.44444444,   5.55555556,   6.66666667,   7.77777778,
         8.88888889,  10.        ])

values = np.array([2.5,6.5,9.5])

np.searchsorted(tang_array,values):得到应该插入的索引位置
输出:array([3, 6, 9])
疑问:该怎么插入呢???

4.需求:将矩阵中第一列数据降序排序,第三列一列升序
tang_array = np.array(
[[1,0,6],
 [1,7,0],
 [2,3,1],
 [2,4,0]]
)
得出排序后的索引值:
index = np.lexsort([-1*tang_array[:,0],tang_array[:,2]])
输出:array([3, 1, 2, 0])

tang_array = tang_array[index]
输出:
[[2, 4, 0],
[1, 7, 0],
[2, 3, 1],
[1, 0, 6]]

4、数组形状操作
import numpy as np
tang_array = np.arange(10)
tang_array
输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
tang_array.shape 输出:(10,)

1.tang_array.shape = 2,5:改变数组的形状变成2行5列
输出:array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
或者:tang_array.reshape(1,10)

2.为数据新加一列
tang_array = tang_array[:,np.newaxis]
tang_array.shape
输出:(10,1)

tang_array = tang_array[:,np.newaxis,np.newaxis]
输出:(10, 1, 1, 1)

3.如何去除以上多余的列呢,像1这种没有实际意义的
tang_array = tang_array.squeeze()
tang_array.shape
输出(10,)

4.转制:tang_array.transpose() 行列对调 或者tang_array.T

5.数组的连接
a = np.array([[123,456,678],[3214,456,134]])
b = np.array([[1235,3124,432],[43,13,134]])
c = np.concatenate((a,b))⚠️注意:需要将a,b用扩号包起来,类似元组
输出:array([[ 123,  456,  678],
       [3214,  456,  134],
       [1235, 3124,  432],
       [  43,   13,  134]])

指定连接:c = np.concatenate((a,b),axis = 1)
输出:array([[ 123,  456,  678, 1235, 3124,  432],
       [3214,  456,  134,   43,   13,  134]])

np.vstack((a,b)) = np.concatenate((a,b))默认axis=0
np.hstack((a,b)) = np.concatenate((a,b),axis = 1)

6.对数组进行拉平操作,多行变成一行
a.flatten()
输出:array([ 123,  456,  678, 3214,  456,  134])
或者使用a.ravel()
5、数组生成
1.np.array([1,2,3])

2.np.arange(10):构造从0开始数10个整数,所以是0-9

3.np.arange(2,20,2):构造2-20之间没间隔2构造一个数值,不包括20,取前不取后
输出:array([ 2,  4,  6,  8, 10, 12, 14, 16, 18])
指定类型:np.arange(2,20,2,dtype=np.float32)

4.np.linspace(0,10,5):构造0-10之间等差的5个值,会包含前尾
输出:array([  0. ,   2.5,   5. ,   7.5,  10. ])

5.np.logspace(0,1,5):默认是10为底的
输出:array([  1.        ,   1.77827941,   3.16227766,   5.62341325,  10.        ])

6.构造立体网格
x = np.linspace(-20,-10,5,dtype=np.int32)
y = np.linspace(10,20,5,dtype=np.int32)

x,y= np.meshgrid(x,y)

输出x:
array([[-20, -17, -15, -12, -10],
       [-20, -17, -15, -12, -10],
       [-20, -17, -15, -12, -10],
       [-20, -17, -15, -12, -10],
       [-20, -17, -15, -12, -10]], dtype=int32)

输出y:
array([[10, 10, 10, 10, 10],
       [12, 12, 12, 12, 12],
       [15, 15, 15, 15, 15],
       [17, 17, 17, 17, 17],
       [20, 20, 20, 20, 20]], dtype=int32)

7.横向量
np.r_[0:10:2]
输出:array([0, 2, 4, 6, 8])

8.列向量
np.c_[0:10:2]
输出:
array([[0],
       [2],
       [4],
       [6],
       [8]])

6、常用生成函数
1.构造值为0的数组:np.zeros(3)
输出:array([ 0.,  0.,  0.])
np.zeros((3,3))
输出:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

2.构造值为1的数组:np.ones(1)

3.先构造一个空的格式然后填充值
a = np.empty(6)
a.fill(1)

4.构造一个相同的矩阵格式:zeros_like或者ones_like
tang_array = np.array([1,2,3,4])
np.zeros_like(tang_array)
输出:array([0, 0, 0, 0])

np.ones_like(tang_array)
输出:array([1, 1, 1, 1])

5.单位矩阵:只有对角线为1,其他都为0,一个n*n的矩阵
np.identity(5)
输出:
array([[ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  1.]])
7、运算
import numpy as np
x = np.array([5,5])
y = np.array([3,2])

1.np.multiply(x,y):对应位置做乘法运算
输出:array([15, 10])

2、np.dot(x,y):对应位置做乘法运算然后进行想加

3.判断
y = np.array([0,1,1,4])
x = np.array([1,1,1,2])
x == y
输出:array([False,  True,  True, False], dtype=bool)

与:对应位置比较,如果都为非0则为True,0是False ,1为True
np.logical_and(x,y)
输出:array([False,  True,  True,  True], dtype=bool)

或:np.logical_or(x,y)
输出:array([ True,  True,  True,  True], dtype=bool)
8、随机模块
1.np.random.rand():输出一个随机的0-1的浮点型随机数
或者np.random.random_sample()这种用的少

2.np.random.rand(3,2):指定为3行2列的矩阵维度
输出:
array([[ 0.16911943,  0.29939508],
       [ 0.72186879,  0.25800002],
       [ 0.01317978,  0.95518917]])

3.np.random.randint(10,size = (5,4)):输出一个0-10(左闭右开),矩阵维度为3行2列
输出:
array([[6, 5, 8, 6],
       [0, 4, 8, 0],
       [9, 8, 6, 0],
       [5, 0, 1, 1],
       [2, 0, 6, 4]])

4.np.random.randint(0,10,3):输出一个0-10区间的3个整型随机数
输出:array([5, 8, 9])

5.高斯分布
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
输出:
array([-0.06, -0.11, -0.05,  0.12, -0.11, -0.05,  0.09,  0.03, -0.06,  0.03])

6.洗牌:将初始化的数据进行随机打乱
tang_array = np.arange(10)
输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.random.shuffle(tang_array)

输出:array([6, 2, 5, 7, 4, 3, 1, 0, 8, 9])

7.随机的种子:指定一种随机的格式
np.random.seed(1):参数随便定义
mu, sigma = 0,0.1
np.random.normal(mu,sigma,10)
输出:array([-0.17,  0.03,  0.12, -0.03,  0.1 ,  0.05,  0.02, -0.11, -0.02,  0.03])

⚠️:每次执行随机的操作都会输出同样的结果,也就是第一次随机产生的结果
9、文件读写
1.不使用numpy
文件中写入数据
%%writefile tang.txt
1 2 3 4 5 6
2 3 5 8 7 9

读取:
data = []
with open('tang.txt') as f:
    for line in f.readlines():
        fileds = line.split()
        cur_data = [int(x) for x in fileds]
        data.append(cur_data)
data = np.array(data)
data
输出:
array([[1, 2, 3, 4, 5, 6],
       [2, 3, 5, 8, 7, 9]])

2.使用numpy
  1> data = np.loadtxt('tang.txt'):默认情况下是按照空格进行分割的

     如果数据不是按照空格进行分割的情况下应该如下,假如以,分割

     data = np.loadtxt('tang2.txt',delimiter = ',')

  2> 如果数据如下,表头为字符串类型
     %%writefile tang4.txt
     e,r,t,y,u,i
     1,2,3,4,5,6
     但是又不想读取第一行的数据,可以使用skiprows去除第一行
     data = np.loadtxt('tang.txt',delimiter = ',',skiprows=1)

3.usecols = (0,1,4) :指定使用哪几列

4.使用numpy写入数据
tang_array = np.array([[1,2,3],[4,5,6]])
np.savetxt('tang4.txt',tang_array)
np.savetxt('tang4.txt',tang_array,fmt='%d'):指定写入数据类型为整型
np.savetxt('tang4.txt',tang_array,fmt='%d',delimiter = ','): 指定写入类型和分割符
np.savetxt('tang4.txt',tang_array,fmt='%.2f',delimiter = ','): 指定浮点的精度

5.读写array结构

1>读写单个array

  tang_array = np.array([[1,2,3],[4,5,6]])
  np.save('tang_array.npy',tang_array)
  tang = np.load('tang_array.npy')
  输出:
  array([[1, 2, 3],
       [4, 5, 6]])

2>读写多个arrar

  tang_array2 = np.arange(10)

  ⚠️是savez函数和npz文件后缀,其实是将两个npy文件压缩成了一个npz文件,可以解压出来查看
  #以key value 键值对的形式存储
  np.savez('tang.npz',a=tang_array,b=tang_array2)
  data = np.load('tang.npz')  

  #查看所有key
  data.keys()
  #查看所有value
  data.values()

  #根据key值查找array的数据
  data['a']
  输出: array([[1, 2, 3],
               [4, 5, 6]])
  data['b']
  输出:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
上一篇下一篇

猜你喜欢

热点阅读