Numpy

Numpy 使用前需要导入 numpy,一般写作

import numpy as np

可通过 np.+Tab 来查看可使用的函数,并通过 函数 + ?来查看函数的具体帮助信息。

1. ndarray 的创建和使用

 Numpy 封装了一个心得数据类型 ndarray,它是一个多维数组对象。该对象封装了许多常用的数学运算函数。创建它的方法主要为以下几种:

1.1 直接将python的基本数据类型转换为ndarray

 1)将列表转换为ndarray

import numpy as np

lst1 = [3,2,34,1,0]
nd1 = np.array(lst1)
print(nd1)
print(type(nd1))

2) 嵌套列表可以转换为多为ndarray

import numpy as np

lst2 = [[3,0,34,2,4],[2,4,1,4,5]]
nd2 = np.array(lst2)
print(nd2)
print(type(nd2))

将上述例子中的列表转换为元组同样适用。

1.2 利用random 模块生成数组

        如果需要对数组进行一些条件设置,可以适用random。可以用来进行算法的初始化,如正态分布或均匀分布等。下面列举 np.random 模块常用的函数:

表1-1 np.random 模块常用函数
函数描述
np.random.random生成0到1之间的随机数
np.random.uniform生成均匀分布的随机数
np.random.randn生成标准正态的随机数
np.random.randint生成随机的整数
np.random.normal生成正态分布
np.random.shuffle随机打乱顺序
np.random.seed设置随机数种子
random_sample生成随机的浮点数

1.3 创建特定形状的多维数组

        参数初始化时,有时需要生成一些特殊矩阵,如全是0或1的数组或矩阵,这时我们可以利用下表的函数来实现。

表 1-2 Numpy 数组创建函数
函数描述
np.zeros((4,5))创建4✖5的全为0的数组
np.ones((4,5))创建4✖5的全为1的数组
np.empty((4,5))创建4✖5的空数组,数组中的值并不为0,而是未初始化的数值
np.zeros_like(aa)以aa相同维度创建元素全为0的数组
np.ones_like(aa)以aa相同维度创建元素全为1的数组
np.empty_like(aa)以aa相同维度创建空数组
np.eye(4)该函数创建一个4✖4的单位矩阵I
np.full((4,5),233)创建4✖5的元素全为233的数组,233为指定值

将生成的数据保存

import numpy as np

nd3 = np.random.random([4,5])
np.savetxt(X = nd3, fname = './test1.txt')
nd4 = np.loadtxt('./test1.txt')

1.4 利用 arange、linspace 函数生成数组

        arrange 是 numpy 模块中的函数,其格式是:

arrange([start,] stop[,step,], dtype=None)

其中,start(默认为0) 和stop 是用来指定范围, step(可以是小数) 用来设定步长。 

import numpy as np

print(np.arange(10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(0,10))
# [0 1 2 3 4 5 6 7 8 9]
print(np.arange(1,4,0.5))
# [1. 1.5 2. 2.5 3. 3.5]
print(np.arange(9,-1,-1))
#[9 8 7 6 5 4 3 2 1 0]

        linspace 也是numpy 模块中常用的函数,它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等份向量,其格式为:

np.linspace(start, stop, num=50, endpoint = True, retstep = False, dtype = None)

 2. 基本操作

 2.1 获取数据

import numpy as np 

np.random.seed(2021)
nd5 = np.randdom.random([10])
# 获取指定位置的数据,获取第3个元素
nd5[2]
# 截取一段数据
nd5[2:5]
# 截取固定间隔数据
nd5[1:6:2]
# 倒序取数
nd5[::-2]
#截取一个多维数组的一个区域内数据
nd6 = np.arange(25).reshape([5,5])
nd6[1:4,1:4]
# 截取一个多维数组中,数值在一个值域之内的数据
nd6[(nd6 > 2)& (nd6 < 9)]
# 截取多为数组中,指定的行,如读取第3,4行
nd6[[2,3]] # or nd6[[2:4,:]]
# 截取指定的列
nd6[:,2:4]

        除了通过上述的方法外,还可以通过一些函数来实现,如random.choice 函数从指定的样本中随机抽取数据。

import numpy as np
from numpy import random as nr

a = np. arange(1,25,dtype = float)
c1 = nr.choice(a,size = (2,3)) # the size is the shape of the array c1
c2 = nr.choice(a,size = (2,3),replace = False) # when replace is True, the function can         repreat choice one number.
# the paremeter p is the probability of extraction for each element,defaule is same.
c3 = nr.choice(a, size = (2,3), p = a./np.sum(a))
print("repreat")
print(c1)
print("can not repreat")
print(c2)
print("repreat and probaility")
print(c3)

3. Numpy 的算数运算

        主要介绍两种常用的运算:对应元素相乘和点积或内积。

3.1 对应元素相乘

numpy.multiply(x1,x2,/,out = None, *, where = True, casting='same_kind', order = 'K',

                        dtype = None, subok=True[, signature, extobj])

操作可以进行两个矩阵对应相乘或者和单一数值进行运算。 

import numpy as np

A = np.array([[1,2],[0,4]])
B = np.array([[3,5],[2,1]])
A * B # or np.multiply(A,B)
print(A*2.0)
print(A/2.0)
###可以进行一些激活函数的设置
X = np.random.rand(2,3)
def softmid(x):
    return 1/(1 + np.exp(-x))
def relu(x):
    return np.maximun(0,x)
def softmax(x):
    return np.exp(x)/np.sum(np.exp(x))

3.2 点积运算

         点积运算(Dot Product)又称为内积:

numpy.dot(a,b, out = None):a 的行要与 b的列保持一致。

import numpy as np

X1 = np.array([[1,2],[3,4]])
X2 = np.array([[3,5,4],[1,5,2]])
X3 = np.dot(X1,X2)
print(X3)

4. 数组变形

4.1 更改数组的形状

表1-3 Numpy 中改变向量形状的一些函数
函数描述
arr.reshape重新将向量arr维度进行改变,不修改向量本身
arr.resize重新将向量arr维度进行改变,修改向量本身
arr.T对向量arr进行转置
arr.ravel对向量arr进行展平,即将多维数组变成1维数组,不回产生原数组的副本
arr.flatten对向量arr进行展平,即将多维数组变成1维数组,返回原数组的副本
arr.squeeze只能对维数维1的数组降维。对多维数组使用时不会报错,但是不会产生任何影响
arr.transpose对高为矩阵进行轴对换
import numpy as np

arr = np.arange(10)
print(arr)

print(arr.reshape(2,5))
print(arr.reshape(5,-1)) # reshape 函数不支持指定行数或列数,所以-1在这里是有必要的
print(arr.reshape(-1,5))# 行数或列数一定是能够被整除

'''
[[0 1 2 3 4]
 [5 6 7 8 9]]
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
[[0 1 2 3 4]
 [5 6 7 8 9]]
'''
# ravel
arr = np.arange(12).reshape(2,-1)
print(arr)
print("按照列优先,展平")
print(arr.ravel('F'))
print("按照行优先,展开")
print(arr.ravel())
'''
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
按照列优先,展平
[ 0  6  1  7  2  8  3  9  4 10  5 11]
按照行优先,展开
[ 0  1  2  3  4  5  6  7  8  9 10 11]
'''
# flatten: 将矩阵转为向量,这种需求经常出现在卷积网络与全连接层之间。
a = np.floor(10*np.random.random((3,4)))
print(a)
print(a.flatten())
'''
[[8. 3. 8. 1.]
 [3. 2. 2. 9.]
 [7. 4. 0. 0.]]
[8. 3. 8. 1. 3. 2. 2. 9. 7. 4. 0. 0.]
'''
# transpose: 对高维矩阵进行轴对话,如把图片中表示颜色顺序的RGB改为GBR
arr2 = np.arange(24).reshape(2,3,4)
print(arr2.shape)
print(arr2.transpose(1,2,0).shape)
'''
(2, 3, 4)
(3, 4, 2)
'''

4.2 合并数组

表1-4 Numpy 数组合并方法
函数描述
np.append内存占用大
np.concatenate没有内存问题
np.stack沿着新的轴加入一系列数组
np.hstack堆栈数组垂直顺序(行)
np.vstack堆栈数组垂直顺序(列)
np.dstack堆栈数组按顺序深入(沿第3维)
np.vsplit将数组分解成垂直的多个子数组的列表

5. 批量处理

 批量数据(Mini-Batch)一般用来处理大规模数据。可通过以下步骤:

得到数据集;随机打乱数据;定义批大小;批处理数据集

# 生成10000个形状为2✖3的矩阵
data_train = np.random.randn(10000,2,3)
print(data_train.shape)
# 打乱这10000条数据
np.random.shuffle(data_train)
#定义批大小
batch_size = 100
# 进行批处理
for i in range(0,len(data_train),batch_size):
    x_batch_sum = np.sum(data_train[i:i+batch_size])
    print("第{}批次,该批次的数据之和:{}".format(i,x_batch_sum))

6. 通用函数(ufunc)

它是一种能对数组的每个元素进行操作的函数,它比math模块中的函数更灵活,可以利用向量或矩阵来避免使用循环语句,这点非常重要。

表1-5 Numpy 中的几个常用通用函数
函数使用方法
sqrt计算序列化数据的平方根
sin,cos三角函数
abs计算序列化数据的绝对值
dot矩阵运算
log,log10,log2对数函数
exp指数函数
cumsum,cumproduct累计求和、求积
sum对一个序列化数据进行求和
mean计算均值
median计算中位数
std计算标准差
var计算方差
corrcoef计算相关系数

6.1 math 和 numpy 函数的性能比较

import time 
import math
import numpy as np

x = [i * 0.001 for i in np.arange(1000000)]
start = time.perf_counter()
for i,t in enumerate(x):
    x[i] = math.sin(t)
print("math.sin: ", time.perf_counter() - start)

x = [i * 0.001 for i in np.arange(1000000)]
x = np.array(x)
start = time.perf_counter()
x = np.sin(x)
print("numpy.sin: ", time.perf_counter() - start)

'''
math.sin:  0.2484094000000141
numpy.sin:  0.0017265000000179498
'''

7. 总结

如果想了解更多的内容,可以登录Numpy 官方网站(http://www.Numpy.org/)查看更多内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值