目录
1.1.4 利用 arange、linspace 函数生成数组
1.1 生成NumPy数组
1.1.1 从已有数据中创建数组
import numpy as np
lst = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
nd =np.array(lst)
1.1.2 利用 random 模块生成数组
1.1.3 创建特定形状的多维数组
1.1.4 利用 arange、linspace 函数生成数组
np.arange([start,] stop[,step,], dtype=None)
其中start 与 stop 指定范围,step 设定步长,生成一个 ndarray,start 默认为 0,步长 step 可为小数。Python有个内置函数range功能与此类似,但是最大的区别是python内置的range函数step必须为整数。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
它可以根据输入的指定数据范围以及等份数量,自动生成一个线性等分向量,其中endpoint (包含终点)默认为 True,等分数量num默认为 50。如果将retstep设置为 True,则会返回一个带步长的 ndarray。
1.1.5数组的保存与重用
数组以二进制格式保存
np.save("filename.npy",a)
b = np.load("filename.npy")
存取文本文件
np.savetxt("filename.txt",a)
b = numpy.loadtxt("filename.txt", delimiter=',')
1.2 获取元素
1.2.1简单获取(索引与切片)
import numpy as np
np.random.seed(2019)
nd11 = np.random.random([10])
#获取指定位置的数据,获取第4个元素
nd11[3]
#截取一段数据
nd11[3:6]
#截取固定间隔数据
nd11[1:6:2]
#倒序取数
nd11[::-2]
#截取一个多维数组的一个区域内数据
nd12=np.arange(25).reshape([5,5])
nd12[1:3,1:3]
#截取一个多维数组中,数值在一个值域之内的数据
nd12[(nd12>3)&(nd12<10)]
#截取多维数组中,指定的行,如读取第2,3行
nd12[[1,2]] #或nd12[1:3,:]
##截取多维数组中,指定的列,如读取第2,3列
nd12[:,1:3]
1.2.2随机获取
import numpy as np
from numpy import random as nr
a=np.arange(1,25,dtype=float)
c1=nr.choice(a,size=(3,4)) #size指定输出数组形状
c2=nr.choice(a,size=(3,4),replace=False) #replace缺省为True,即可重复抽取。
#下式中参数p指定每个元素对应的抽取概率,缺省为每个元素被抽取的概率相同。
c3=nr.choice(a,size=(3,4),p=a / np.sum(a))
1.3 NumPy的算术运算
1.3.1对应元素相乘
对应元素相乘(element-wise product)是两个矩阵中对应元素乘积。np.multiply 函数用于数组或矩阵对应元素相乘,输出与相乘数组或矩阵的大小一致,其格式如下:
numpy.multiply(x1, x2, /, out=None, *,
where=True,casting='same_kind', order='K',
dtype=None, subok=True[, signature, extobj])
A = np.array([[1, 2], [-1, 4]])
B = np.array([[2, 0], [3, 4]])
A*B
##结果如下:
array([[ 2, 0],
[-3, 16]])
#或另一种表示方法
np.multiply(A,B)
#运算结果也是
array([[ 2, 0],
[-3, 16]])
1.3.2 点积运算
点积运算(dot product)又称为内积,在NumPy用np.dot表示,其一般格式为:
numpy.dot(a, b, out=None)
X1=np.array([[1,2],[3,4]])
X2=np.array([[5,6,7],[8,9,10]])
X3=np.dot(X1,X2)
矩阵X1和矩阵X2进行点积运算,其中X1和X2对应维度(即X1的第2个维度与X2的第1个维度)的元素个数必须保持一致,此外,矩阵X3的形状是由矩阵X1的行数与矩阵X2的列数构成的。
1.4 数组变形
1.4.1 更改数组的形状
此处只做简单笔记欲知详细用法,可访问谷歌百度等
注意:reshape与resize的区别,reshape不会改变数组本身,而resize会改变数组本身。
1.4.2 合并数组
①append、concatnate以及stack都有一个 axis 参数,用于控制数组合并是按行还是按列。
②对于append和concatnate,待合并的数组必须有相同的行数或列数(满足一个即可)。
③stack、hstack、dstack待合并的数组必须具有相同的形状( shape)。
1.5 批量处理
如何把大数据拆分成多个批次呢?可采用如下步骤:
(1)得到数据集
(2)随机打乱数据
(3)定义批大小
(4)批处理数据集
以下我们通过一个示例来具体说明:
import numpy as np
#生成10000个形状为2X3的矩阵
data_train = np.random.randn(10000,2,3)
#这是一个3维矩阵,第一个维度为样本数,后两个是数据形状
print(data_train.shape)
#(10000,2,3)
#打乱这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))
1.6 通用函数
1.7 广播机制
NumPy的Universal functions 中要求输入的数组shape是一致的,当数组的shape不相等的时候,则会使用广播机制。不过,调整数组使得shape一样,需满足一定规则,否则将出错。这些规则可归结为以下四条:
(1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐;
如:a:2x3x2 b:3x2,则b向a看齐,在b的前面加1:变为:1x3x2
(2)输出数组的shape是输入数组shape的各个轴上的最大值;
(3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错;
(4)当输入数组的某个轴的长度为1时,沿着此轴运算时都用(或复制)此轴上的第一组值。
目的:A+B
其中A为4x1矩阵,B为一维向量 (3,)
要相加,需要做如下处理:
(1)根据规则1,B需要向看齐,把B变为(1,3)
(2)根据规则2,输出的结果为各个轴上的最大值,即输出结果应该为(4,3)矩阵
那么A如何由(4,1)变为(4,3)矩阵?B如何由(1,3)变为(4,3)矩阵?
3)根据规则4,用此轴上的第一组值(要主要区分是哪个轴),进行复制(但在实际处理中不是真正复制,否则太耗内存,而是采用其它对象如ogrid对象,进行网格处理)即可,