python之Numpy

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值