1、可通过用Numpy工具包生成模拟数据集
使用RandomState获得随机数生成器
from numpy.random import RandomState
rdm = RandomState(1)
#1为随机种子,只要随机种子seed相同,产生的随机数序列就相同
a = rdm.uniform(1,2,(3,4))
print(a)
结果为:
[[ 1.417022 1.72032449 1.00011437 1.30233257]
[ 1.14675589 1.09233859 1.18626021 1.34556073]
[ 1.39676747 1.53881673 1.41919451 1.6852195 ]]
产生一个3行4列的数组,其中每个元素都是在[1,2]区间内均匀分布的随机数
2、多维数组的构成及切片等操作
b= np.arange(120).reshape(2,3,4,5),则生成一个4维数组,一共有120个元素。最外层是两个大数组(也可以看做两个数组类型的元素),每个大数组内部有3个小数组(也可以看做3个数组类型的元素),每个小数组内有4个小数组(也可以看做4个数组类型的元素),每个小数组内有5个元素。
array([[[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19]],
[[ 20, 21, 22, 23, 24],
[ 25, 26, 27, 28, 29],
[ 30, 31, 32, 33, 34],
[ 35, 36, 37, 38, 39]],
[[ 40, 41, 42, 43, 44],
[ 45, 46, 47, 48, 49],
[ 50, 51, 52, 53, 54],
[ 55, 56, 57, 58, 59]]],
[[[ 60, 61, 62, 63, 64],
[ 65, 66, 67, 68, 69],
[ 70, 71, 72, 73, 74],
[ 75, 76, 77, 78, 79]],
[[ 80, 81, 82, 83, 84],
[ 85, 86, 87, 88, 89],
[ 90, 91, 92, 93, 94],
[ 95, 96, 97, 98, 99]],
[[100, 101, 102, 103, 104],
[105, 106, 107, 108, 109],
[110, 111, 112, 113, 114],
[115, 116, 117, 118, 119]]]])
多维数组操作:
取元素 X[n0,n1]
这是最基本的情况,表示取 第0维 的第 n0 个元素,继续取 第1维 的第 n1个元素。如 X[2,2] 表示第0维第2个元素[20,21,22,23],然后取其第1维的第2个元素即 22;
例如:b[1,2],结果为:
array([[100, 101, 102, 103, 104],
[105, 106, 107, 108, 109],
[110, 111, 112, 113, 114],
[115, 116, 117, 118, 119]])
切片 X[s0:e0,s1:e1]
这是最通用的切片操作,表示取 第0维 的第 s0 到 e0 个元素,继续取 第1维 的第 s1 到 e1 个元素(左闭右开)。如 X[1:3,1:3] 表示第0维第(1:3)个元素[[10,11,12,13],[20,21,22,23]],然后取其第1维的第(1:3)个元素即 [[11,12],[21,22]];
切片特殊情况 X[:e0,s1:]
特殊情况,即左边从0开始可以省略X[:e0,s1:e1],右边到结尾可以省略X[s0:,s1:e1],取某一维全部元素X[:,s1:e1],事实上和Python 的 序列切片规则是一样的。
常见的 X[:,0] 则表示 第0维取全部,第1维取0号元素;
b.flatten():把所有元素平铺,放到一个一维数组中。
b.flatten()结果为:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,
91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
117, 118, 119])
3、np.mean()操作解析:
代码片段:如果图片是RGB格式(一个三维的numpy数组)的话,就转成二维的。
img是一个60*160*3的图片数组,如何将图片保存在数组中,看第6条
def convert2gray(img):
if len(img.shape) > 2:
gray = np.mean(img, -1) #可以理解成把RGB中是把高度维去掉,其他维求平均值,便会返回一个二维的数组,也就是把图片灰化了
# 上面的转法较快,正规转法如下
# r, g, b = img[:,:,0], img[:,:,1], img[:,:,2]
# gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
return gray
else:
return img
解析:tmp为(60, 160, 3),以下将其中一维去掉,结果是二维数组,每个位置维去掉维方向上的平均值
>>> b = np.mean(tmp, -1) #去掉最后一维,与d = np.mean(tmp, 2)相同
>>> np.shape(b)
(60, 160)
>>> np.shape(tmp)
(60, 160, 3)
>>> c = np.mean(tmp, 0) #去掉第一维
>>> np.shape(c)
(160, 3)
>>> d = np.mean(tmp, 1) #去掉第二维
>>> np.shape(d)
(60, 3)
mean()函数功能:求取均值
经常操作的参数为axis,以m * n矩阵举例:
- axis 不设置值,对 m*n 个数求均值,返回一个实数
- axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
- axis =1 :压缩列,对各行求均值,返回 m *1 矩阵
例子1:
1. 数组的操作:
>>> a = np.array([[1, 2], [3, 4]])
>>> a
array([[1, 2],
[3, 4]])
>>> np.mean(a)
2.5
>>> np.mean(a, axis=0) # axis=0,计算每一列的均值
array([ 2., 3.])
>>> np.mean(a, axis=1) # 计算每一行的均值
array([ 1.5, 3.5])
>>>
2.矩阵的操作
>>> import numpy as np
>>> num1 = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
>>> num1
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
>>> num2 = np.mat(num1) #把数组或者列表矩阵化
>>> num2
matrix([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
>>> np.mean(num2) # 对所有元素求均值
3.5
>>> np.mean(num2,0) # 压缩行,对各列求均值
matrix([[ 2.5, 3.5, 4.5]])
>>> np.mean(num2,1) # 压缩列,对各行求均值
matrix([[ 2.],
[ 3.],
[ 4.],
[ 5.]])
例子2:
>>> c = np.array([[2,3,4,5], [1,2,3,4], [2, 5, 6, 8]])
>>> np.mean(c, 0)
array([1.66666667, 3.33333333, 4.33333333, 5.66666667])
>>> np.mean(c, 1)
array([3.5 , 2.5 , 5.25])
>>> np.mean(c, -1)
array([3.5 , 2.5 , 5.25])
>>> np.mean(c, -2)
array([1.66666667, 3.33333333, 4.33333333, 5.66666667])
>>> np.mean(c, -3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
综上可以发现:np.mean(c, 1)和np.mean(c, -1)结果一样,np.mean(c, 0)和np.mean(c, -2)一样
4、 mat()函数与array()函数生成矩阵所需的数据格式有区别
(1) mat()函数中数据可以为字符串以分号(;)分割,或者为列表形式以逗号(,)分割。而array()函数中数据只能为后者形式。
(2) 而array()函数生成矩阵时数据只能为列表形式。
2. mat()函数与array()函数生成的矩阵计算方式不同
(1) mat()函数中矩阵的乘积可以使用(星号) * 或 .dot()函数,其结果相同。而矩阵对应位置元素相乘需调用numpy.multiply()函数。
(2) array()函数中矩阵的乘积只能使用 .dot()函数。而星号乘 (*)则表示矩阵对应位置元素相乘,与numpy.multiply()函数结果相同。
5、np.shape()返回矩阵的每一维上的数量:
如果构建的不是一个矩阵,那么np.shape()只返回行数,第一层的
>>> b = np.array([[1,2],[1,2,3]])
>>> np.shape(b)
(2,)
如果构建的是一个矩阵,那么np.shape()返回行和列数目,即每一维上的数量
>>> num1 = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
>>> np.shape(num1)
(4, 3)
6、numpy图片操作:读取图片保存在array中:
>>> from PIL import Image
>>> image = Image.open('captcha_tmp.jpg')
>>> image
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=160x60 at 0x29AB0035940>
>>> import numpy as np
>>> image_array = np.array(image)
>>> image_array
array([[[251, 254, 255],
[251, 254, 255],
[253, 253, 255],
...,
[255, 255, 253],
[255, 255, 253],
[255, 255, 253]],
……
>>> np.shape(image_array)
(60, 160, 3)
输出图片形状,是一个三维数组,即长宽高,每一维上长度分别为60 160 3