数据分析

数据分析

概念

  把隐藏在一些看似杂论无章的数据背后的信息提炼出来,总结出所研究对象的内在规律。

  数据分析三剑客:Numpy、Pandas、Matplotlib

  Numpy(Numerical Python)是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

创建ndarray

import numpy as np

使用np.array()创建

一维数据创建

np.array([1, 2, 3, 4, 5])

# 输出:
    array([1, 2, 3, 4, 5])

二维数据创建

np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

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

  注意:

    Numpy默认ndarray的所有元素的类型是相同的;

    如果传进来的列表中包含不同的类型,则统一位同一类型,优先级:str > float > int;

np.array([[1, 2, 3], [4, '5', 6], [7, 8, 9]])

# 输出:
    array([['1', '2', '3'],
          ['4', '5', '6'],
          ['7', '8', '9']], dtype='<U11')

  使用matplotlib.pyplot获取一个numpy数组,数据源于一张图片

import matplotlib.pyplot as plt

img_arr = plt.imread('./lmy.jpg')
plt.imshow(img_arr)

# 输出:
    <matplotlib.image.AxesImage at 0x25b81a877b8>

  对数组进行算术运算

plt.imshow(img_arr-25)

# 输出:
    <matplotlib.image.AxesImage at 0x25b88d19080>

 

  数组的形状

img_arr.shap

# 输出:
    (1440, 1080, 3)

  操作该numpy数据,该操作会同步到图片中

 使用np的routines函数创建

  包含一下常见创建方法:

  1) np.ones(shape, dtype=None, order='C')  # 创建以1填充的指定大小的数组

np.ones(shape=(20, 30))

# 输出:
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
        1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])

  2) np.zeros(shape, stype=None, order='C')  # 创建以1填充的指定大小的数组

np.zeros(shape=(20, 30))

# 输出:
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
        0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])

   3) np.full(shape, fill_value, dtype=None, order='C')  # 自定义数组的大小、自定义填充的内容

np.full(shape=(5, 6), fill_value=9527)

# 输出:
array([[9527, 9527, 9527, 9527, 9527, 9527],
       [9527, 9527, 9527, 9527, 9527, 9527],
       [9527, 9527, 9527, 9527, 9527, 9527],
       [9527, 9527, 9527, 9527, 9527, 9527],
       [9527, 9527, 9527, 9527, 9527, 9527]])

   4)np.linspace(start, stop, num=50, endpoint=True, restep=False, dtype=None)  # 构造等差数组

np.linspace(1, 100, num=20)

# 输出:
array([  1.        ,   6.21052632,  11.42105263,  16.63157895,
        21.84210526,  27.05263158,  32.26315789,  37.47368421,
        42.68421053,  47.89473684,  53.10526316,  58.31578947,
        63.52631579,  68.73684211,  73.94736842,  79.15789474,
        84.36842105,  89.57894737,  94.78947368, 100.        ])

  5)np.arange([start, ]stop, [step,]dtype-None)  # 循环生成数组

np.arange(0, 100, step=2)

# 输出:
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32,
       34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66,
       68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98])

  6)np.random.randint(low, high=None, size=None, dtype='l')  # 随机产生指定大小的数组

np.random.randint(0, 100, size=(5, 7))

# 输出
array([[49, 10, 15, 24, 84, 64, 22],
       [39, 30, 60, 76, 53, 79,  2],
       [64, 29,  8, 89, 68,  7, 95],
       [59, 56, 86, 94, 47,  2, 18],
       [62, 72, 51, 70, 62, 34, 85]])

   上边这样产生数组,每次都是不一样的,因为里边的元素都是随机产生的。

np.random.seed(5)  # 固定时间种子,产生的随机数就固定下来了
np.random.randint(0, 100, size=(5, 7))

# 输出
array([[99, 78, 61, 16, 73,  8, 62],
       [27, 30, 80,  7, 76, 15, 53],
       [80, 27, 44, 77, 75, 65, 47],
       [30, 84, 86, 18,  9, 41, 62],
       [ 1, 82, 16, 78,  5, 58,  0]])

   7)np.random.randn(d0, d1, ..., dn)  # 标准正太分布的数组

arr = np.random.randn(4, 5)

  8) np.random.random(size=None)  # 生成0到1的随机数,左闭右开

np.random.seed(3)
np.random.random(size=(3,4))

# 输出
array([[0.5507979 , 0.70814782, 0.29090474, 0.51082761],
       [0.89294695, 0.89629309, 0.12558531, 0.20724288],
       [0.0514672 , 0.44080984, 0.02987621, 0.45683322]])

 ndarray的属性

  4个必记参数:

    ndim:维度

arr = np.random.randn(4, 5)
arr.ndim

# 输出
2

    shape:形状(各维度的长度)

arr = np.random.randn(4, 5)
arr.shape

# 输出
(4, 5)

    size: 总长度

arr = np.random.randn(4, 5)
arr.size

# 输出
20

    dtype:元素类型

arr = np.random.randn(4, 5)
arr.dtype

# 输出
dtype('float64')

  type(arr)

arr = np.random.randn(4, 5)
type(arr)

# 输出
numpy.ndarray

ndarray的基本操作

索引

  一维与列表完全一致  多维时同理

arr[1][2]

# 输出
0.48624932610831123

   根据索引修改数据

arr[1][2] = 1
arr

# 输出
array([[-0.51664792, -0.18907167, -0.41619802,  0.72465766, -0.68996068],
       [ 0.48641448,  0.85151895,  1.        , -0.83423985,  1.34499246],
       [-0.67821268,  0.42643507, -0.75333479, -1.74411025,  0.22575027],
       [ 0.28703516, -0.07744096,  0.2760685 , -0.64841089, -0.73746484]])

​

切片

  一维与列表完全一致  多维时同理

  arr[0: 2]  # 横着切,切列;获取二维数组的前两行

arr = np.random.randint(60, 120, size=(6, 4))
arr
# arr结构
array([[ 82, 105,  96, 100],
       [ 86, 112,  69,  79],
       [100,  65, 114,  72],
       [ 86,  95,  84, 112],
       [ 94, 103, 115,  83],
       [110,  78,  60,  67]])

arr[0: 2]

# 输出
array([[ 82, 105,  96, 100],
       [ 86, 112,  69,  79]])

  arr[:, 0:2]  # 竖着切,切前两行;其中,左边是行,右边是列。获取二维数组的前两列。

arr[:, 0:2]

# 输出
array([[ 82, 105],
       [ 86, 112],
       [100,  65],
       [ 86,  95],
       [ 94, 103],
       [110,  78]])

  获取二维数组前两行和前两列数据

arr[0: 2, 0: 2]

# 输出
array([[ 82, 105],
       [ 86, 112]])

  将数据反转,例如[1, 2, 3] ---> [3, 2, 1]

  ::  进行切片

  将数组的行进行倒序  (将第一行换到倒数第一行,以此类推)

arr = np.random.randint(65, 130, size=(6, 4))
arr
# arr
array([[127,  91,  65, 101],
       [119, 102, 101,  88],
       [ 83, 109,  96,  76],
       [ 89,  91,  69, 121],
       [ 65,  85, 120,  75],
       [ 70, 124,  74, 119]])
arr[::
-1] # 输出 array([[ 70, 124, 74, 119], [ 65, 85, 120, 75], [ 89, 91, 69, 121], [ 83, 109, 96, 76], [119, 102, 101, 88], [127, 91, 65, 101]] )

   列倒序

arr[:, ::-1]

# 输出
array([[101,  65,  91, 127],
       [ 88, 101, 102, 119],
       [ 76,  96, 109,  83],
       [121,  69,  91,  89],
       [ 75, 120,  85,  65],
       [119,  74, 124,  70]])

  全部倒序

arr[::-1, ::-1]

# 输出
array([[119,  74, 124,  70],
       [ 75, 120,  85,  65],
       [121,  69,  91,  89],
       [ 76,  96, 109,  83],
       [ 88, 101, 102, 119],
       [101,  65,  91, 127]])

  将图片进行全倒置

  读取图片

img_arr = plt.imread('./XiangShan.jpg')
plt.imshow(img_arr)

# 输出
<matplotlib.image.AxesImage at 0x25b88ee05c0>

  查看图片数组形状

img_arr.shape

# 输出
(4032, 3024, 3)

  颜色图片倒置

plt.imshow(img_arr[:, :, ::-1])

# 输出
<matplotlib.image.AxesImage at 0x25b876810f0>

  图片全倒置

plt.imshow(img_arr[::-1, ::-1, ::-1])

# 输出
<matplotlib.image.AxesImage at 0x25b876c6a58>

  随机生成二维图片

my_pic_arr = np.random.randint(0,255,size=(500,500,3),dtype=np.uint8)
plt.imshow(my_pic_arr)

# 输出
<matplotlib.image.AxesImage at 0x25b890fa908>

  注意:

    有些机器运行上述代码在没有指定dtype时,会出现 ValueError: 3-dimensional arrays must be of dtype unsigned byte, unsigned short, float32 or float64 的错误,这时只需要加上 dtype=np.uint8 就可以了,这一步操作是将编码方式指定为系统自带的编码方式。

 变形

   使用arr.reshape()函数,注意参数是一个tuple!

基本使用

  1. 将一维数组变形成多维数组

arr

# 输出
array([[127,  91,  65, 101],
       [119, 102, 101,  88],
       [ 83, 109,  96,  76],
       [ 89,  91,  69, 121],
       [ 65,  85, 120,  75],
       [ 70, 124,  74, 119]])

  arr1 = arr.reshape(24)

arr1 = arr.reshape(24)

  arr1.reshape(2, 4, 3)

arr1.reshape(2, 4, 3)

# 输出
array([[[127,  91,  65],
        [101, 119, 102],
        [101,  88,  83],
        [109,  96,  76]],

       [[ 89,  91,  69],
        [121,  65,  85],
        [120,  75,  70],
        [124,  74, 119]]])

   arr1.reshape(3, -1)  # -1表示自动计算行数/列数

arr1.reshape(3, -1)

# 输出
array([[ 90,  73,  68, 117,  80,  65,  68,  71],
       [ 90,  83,  88, 105, 128,  97,  92, 103],
       [ 78, 105,  76,  84, 120,  98,  94,  77]])

   2. 将多维数组变成一维数组

arr1 = arr.reshape(24)
arr1

# 输出
array([108, 102, 129,  76, 104, 122, 128,  88, 112, 107, 100,  87, 100,
        86,  76, 112, 110,  94,  99, 100,  90,  66, 127, 119])

图片倒置

  1. 将图片读取并转化成数组

arr_img = plt.imread('./train.jpg')

  2. 查看图片维度大小

arr_img.shape

# 输出
(1080, 1440, 3)

  3. 将三维的图片变成一维,大小为原图片大小

arr_1_img = arr_img.reshape(1080*1440*3)

  4. 对一维数组中所有的元素倒置

v_arr_1 = arr_1_img[::-1]
v_arr_1

# 输出
array([119, 119, 105, ..., 255, 255, 255], dtype=uint8)

  5. 将一维数组变成三维数组

plt.imshow(v_arr_1.reshape(1080, 1440, 3))

# 输出
<matplotlib.image.AxesImage at 0x21cd33d7470>

级联

   np.concatenate()

  1. 一维、二维、多维数组的级联,实际操作中级联多为二维数组

  生成一个6×4的数组

arr

# 输出
array([[ 90,  73,  68, 117],
       [ 80,  65,  68,  71],
       [ 90,  83,  88, 105],
       [128,  97,  92, 103],
       [ 78, 105,  76,  84],
       [120,  98,  94,  77]])

  axis=0  轴向: 0表示是竖直的轴向  1表示水平的轴向

 水平级联
np.concatenate((arr, arr), axis=1)

# 输出
array([[ 90,  73,  68, 117,  90,  73,  68, 117],
       [ 80,  65,  68,  71,  80,  65,  68,  71],
       [ 90,  83,  88, 105,  90,  83,  88, 105],
       [128,  97,  92, 103, 128,  97,  92, 103],
       [ 78, 105,  76,  84,  78, 105,  76,  84],
       [120,  98,  94,  77, 120,  98,  94,  77]])

   竖直级联

np.concatenate((arr, arr), axis=0)

# 输出
array([[ 90,  73,  68, 117],
       [ 80,  65,  68,  71],
       [ 90,  83,  88, 105],
       [128,  97,  92, 103],
       [ 78, 105,  76,  84],
       [120,  98,  94,  77],
       [ 90,  73,  68, 117],
       [ 80,  65,  68,  71],
       [ 90,  83,  88, 105],
       [128,  97,  92, 103],
       [ 78, 105,  76,  84],
       [120,  98,  94,  77]])

   

  准备两个数组,一个6×4, 一个3×4


arr = np.random.randint(65, 130, size=(6, 4))
arr
'''
输出
array([[ 90,  73,  68, 117],
       [ 80,  65,  68,  71],
       [ 90,  83,  88, 105],
       [128,  97,  92, 103],
       [ 78, 105,  76,  84],
       [120,  98,  94,  77]])

'''

arr1 = np.random.randint(0, 100, size=(3, 4))
arr1
'''
输出
array([[74, 62, 44, 42],
       [22, 67, 55, 10],
       [58, 26, 77, 95]])

'''

   两个大小不一样的素组之间的级联

np.concatenate((arr, arr1), axis=0)
'''
输出 array([[ 90, 73, 68, 117], [ 80, 65, 68, 71], [ 90, 83, 88, 105], [128, 97, 92, 103], [ 78, 105, 76, 84], [120, 98, 94, 77], [ 74, 62, 44, 42], [ 22, 67, 55, 10], [ 58, 26, 77, 95]]) '''

   一维数组无法和二维数组级联

arr1 = np.random.randint(0, 100, size=(3, 4))
arr1
'''
输出
array([[74, 62, 44, 42],
       [22, 67, 55, 10],
       [58, 26, 77, 95]])
'''

arr2 = np.array([1, 2, 3, 4])
arr2
'''
array([1, 2, 3, 4])
'''

np.concatenate((arr1, arr2), axis=0)
'''
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-37-9b03f799ca88> in <module>()
----> 1 np.concatenate((arr1, arr2), axis=0)

ValueError: all the input arrays must have same number of dimensions
'''

  2. 合并两张照片

arr_flower = plt.imread('./flower.jpg')
arr = np.concatenate((arr_flower, arr_flower, arr_flower), axis=1)
arr_result = np.concatenate((arr, arr, arr), axis=0)
plt.imshow(arr_result)

'''
输出
<matplotlib.image.AxesImage at 0x21cd26d7208>
'''

  3. np.hstack与np.vstack

  np.hstack

arr_flower = plt.imread('./flower.jpg')
arr = np.concatenate((arr_flower, arr_flower, arr_flower), axis=1)
arr_result = np.concatenate((arr, arr, arr), axis=0)
a = np.vstack((arr_result, arr_result))
plt.imshow(a)

'''
输出
<matplotlib.image.AxesImage at 0x21cd3474cf8>
'''

  np.vstack

arr_flower = plt.imread('./flower.jpg')
arr = np.concatenate((arr_flower, arr_flower, arr_flower = plt.imread('./flower.jpg')
arr = np.concatenate((arr_flower, arr_flower, arr_flower), axis=1)
arr_result = np.concatenate((arr, arr, arr), axis=0)
a = np.vstack((arr_result, arr_result))
plt.imshow(a)arr_flower), axis=1)
arr_result = np.concatenate((arr, arr, arr), axis=0)
b = np.vstack((arr_result, arr_result))
plt.imshow(b)

'''
输出
 <matplotlib.image.AxesImage at 0x21cd30437f0>                                                                                                                                                      
'''

  级联需要注意的点:

    ● 级联的参数是列表:一定要加中括号或者小括号

    ● 维度必须相同

    ● 形状相符:在维度保持一致的前提下,如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致。如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致。

    ● 可通过axis参数改变级联的方向。

 切分

  与级联类似,三个函数完成切分工作:

    ● np.split(arr, 行/列号, 轴): 参数2是一个列表类型

    ● np.vsplit

    ● np.hsplit

  获取一个数组

np.random.seed(10)
num_arr = np.random.randint(60, 100, size=(5, 6))
num_arr
'''
输出
array([[69, 96, 75, 60, 88, 85],
       [89, 89, 68, 69, 60, 96],
       [76, 96, 71, 84, 93, 68],
       [96, 74, 73, 65, 73, 85],
       [73, 88, 82, 90, 90, 85]])

'''

   对数组进行分割

np.split(num_arr, [2, 3], axis=1)

'''
输出
[array([[69, 96],
        [89, 89],
        [76, 96],
        [96, 74],
        [73, 88]]), array([[75],
        [68],
        [71],
        [73],
        [82]]), array([[60, 88, 85],
        [69, 60, 96],
        [84, 93, 68],
        [65, 73, 85],
        [90, 90, 85]])]
'''

   np.vsplit  切列

np.vsplit(num_arr, [2, 3])

'''
输出
[array([[69, 96, 75, 60, 88, 85],
        [89, 89, 68, 69, 60, 96]]),
 array([[76, 96, 71, 84, 93, 68]]),
 array([[96, 74, 73, 65, 73, 85],
        [73, 88, 82, 90, 90, 85]])]
'''

   np.hsplit

np.hsplit(num_arr, [2, 3])

'''
输出
[array([[69, 96],
        [89, 89],
        [76, 96],
        [96, 74],
        [73, 88]]), array([[75],
        [68],
        [71],
        [73],
        [82]]), array([[60, 88, 85],
        [69, 60, 96],
        [84, 93, 68],
        [65, 73, 85],
        [90, 90, 85]])]
'''

  切分照片

   1. 读取照片

import matplotlib.pyplot as plt
import numpy as np

img_arr = plt.imread('./MyL.jpg')  #./MyL.jpg为图片的路径
plt.imshow(img_arr) ''' 输出 <matplotlib.image.AxesImage at 0x20d56c9a438> '''

  2. 水平切

imgs = np.split(img_arr, [0, 1200], axis=0)
plt.imshow(imgs[1])

'''
输出
<matplotlib.image.AxesImage at 0x20d56f7e080>
'''

  它的切割结果为三份,第一份为[0, 0], 第二份为[0, 1200],第三份为[1200, 1350]。其中,查看数组形状:

img_arr.shape

'''
输出
(1350, 1012, 3)
'''

  3. 纵向切

img_data = np.split(imgs[1], [100, 1000], axis=1)[1]
plt.imshow(img_data)

'''
输出
<matplotlib.image.AxesImage at 0x20d56daf2b0>
'''

  它的切割结果同样也为三份,第一份为[0, 100],第二份为[100, 1000],第三份为[1000, 1012]。

 副本

  所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对应生效。

arr = np.array([1, 2, 3, 4, 5])
a = arr.copy()
a[1] = 10

arr
'''
输出
array([1, 2, 3, 4, 5])
'''

a
'''
输出
array([ 1, 10,  3,  4,  5])
'''

 ndarray的聚合操作

 求和 np.sum()

a = np.array([1, 10, 3, 4, 5])
s.sum()

'''
输出
23
'''

  对所有元素进行累加求和。

最大值(np.max())/最小值(np.min())

a = np.array([1, 10, 3, 4, 5])
a.max()
'''
输出
10
'''
a.min()
'''
输出
1
'''

0

原文地址:https://www.cnblogs.com/ZN-225/p/10284280.html