2018.6.16******************************************************** author:wills
数据分析一般采用 Numpy | Pandas 库中的相关函数进行处理
那么什么数据需要分析呢 ?又要怎么分析呢 ?
我们人眼睛看到的世界,是直观立体的是事物的外在表现形式,这取决于我们的大脑构成,从小到大接受的教育,以及对自然界万事万物的观察以及记忆,我们看到一只鸟,一条鱼,蓝天,白云这些都是万物外在的表现形式.但是他们的内在本质又是什么呢?按照现在科学的理论.地球上的生命绝大部分都是碳基生命,就是一堆碳水化合物再添加一些各种各样的稀有元素构成,再往下层解剖就是由一个个原子分子构成.当然如果按弦理论,那就是一段段的波,各种各样的波构成.好了废话到此结束,就是说人看到的是表象,但是计算机看到的和人看到的是不一样的,比如一张猫图片,人看到就是一只猫,不管猫是什么形状,大小,颜色,品种,是死是活,都可以马上认出这是一只猫.但是计算机不行,它看到的不是一只猫,它’看’到的是一串串数据,以各种格式构成的数据,所以我们数据分析的作用,就是要让计算机通过分析这一串串的数据,认识到这是一只猫,什么形状的猫,什么颜色的猫,什么品种的猫,是死的猫还是活的猫,下面我们先通过一只猫的图片简单认识一下Numpy库
我使用的是Anaconda软件,所有的数据分析相关的包都已经安装好了,如果使用pycharm即其他编辑器的朋友需要自行安装相关的包,以下所有代码都是在jupyter环境下书写的,所有没有print也可以直接打印出变量
首先导入Numpy等相关的包
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
读取图片数据,分别以数据的形式,已经图片形式显示出来
cat = plt.imread('cat.jpg')
cat
array([[[231, 186, 131],
[232, 187, 132],
[233, 188, 133],
...,
[100, 54, 54],
[ 92, 48, 47],
[ 85, 43, 44]],
[[232, 187, 132],
[232, 187, 132],
[233, 188, 133],
...,
[100, 54, 54],
[ 92, 48, 47],
[ 84, 42, 43]],
[[232, 187, 132],
[233, 188, 133],
[233, 188, 133],
...,
[ 99, 53, 53],
[ 91, 47, 46],
[ 83, 41, 42]],
...,
[[199, 119, 82],
[199, 119, 82],
[200, 120, 83],
...,
[189, 99, 65],
[187, 97, 63],
[187, 97, 63]],
[[199, 119, 82],
[199, 119, 82],
[199, 119, 82],
...,
[188, 98, 64],
[186, 96, 62],
[188, 95, 62]],
[[199, 119, 82],
[199, 119, 82],
[199, 119, 82],
...,
[188, 98, 64],
[188, 95, 62],
[188, 95, 62]]], dtype=uint8)
cat.shape # (456, 730, 3)
# .shape属性可以查看图片的形状属性,彩色图片是三维数组,黑白图片是二维数组
# .jpg格式的图片 使用 0 - 255 的uint8类型数字代表每一个像素
# .png格式的图片 使用 0 - 1 的float64类型的数字代表每一个像素
cat.size # 998640
# .size属性表示图片的所有的元素个数,它等于shape中的维度数字相乘 456 * 730 * 3 = 998640
# 修改图片的尺寸与维度,reshape中的维度数据相乘一定要等于.size
# 即新的数据形状 x * y * z * n ... = 456 * 730 *3
cat.reshape(998640) # 直接将数据降成一位数组
cat.reshape(456,730 * 3) # 将数据将成二维
array([[231, 186, 131, ..., 85, 43, 44],
[232, 187, 132, ..., 84, 42, 43],
[232, 187, 132, ..., 83, 41, 42],
...,
[199, 119, 82, ..., 187, 97, 63],
[199, 119, 82, ..., 188, 95, 62],
[199, 119, 82, ..., 188, 95, 62]], dtype=uint8)
# 将彩色图片降为黑白图片
cat1 = cat.reshape(456,730*3)
plt.imshow(cat1) # 这个办法将图片的形状改变了不好,而且图片看着偏绿色
![png](https://img-blog.csdn.net/20180616200441256?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
# 通过查看cat的数据流可以看出,彩色图片第三维是三个用来表示三原色的数字,那么我们只取其中一个数字,那么原图片
# 就在大小不变的情况下转化为二维黑白图片
# .min .max .mean 可以取数组的最大值,最小值,平均值, axis用于确定取值的维度 0 表示第一维
cat2 = cat.min(axis=2) # 取三原色中的小值,图片会偏向黑色
cat3 = cat.max(axis=2) # 取大值,图片偏向白色
cat4 = caan(axis=2) # 取平均值,图片转化为黑白效果最好
plt.imshow(cat3,cmap='gray')
plt.show()
plt.imshow(cat4,cmap='gray')
plt.show()
plt.imshow(cat2,cmap='gray')
![这里写图片描述](https://img-blog.csdn.net/20180616200545466?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180616200605100?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
cat.dtype
# .dtype属性表示数据的类型
dtype('uint8')
cat.astype(np.float64)/255
# .astype 方法可以修改 jpg图片的数据为 0 - 1 的float64类型数据,这样就可以和png格式的图片进行互相交换了
array([[[0.90588235, 0.72941176, 0.51372549],
[0.90980392, 0.73333333, 0.51764706],
[0.91372549, 0.7372549 , 0.52156863],
...,
[0.39215686, 0.21176471, 0.21176471],
[0.36078431, 0.18823529, 0.18431373],
[0.33333333, 0.16862745, 0.17254902]],
[[0.90980392, 0.73333333, 0.51764706],
[0.90980392, 0.73333333, 0.51764706],
[0.91372549, 0.7372549 , 0.52156863],
...,
[0.39215686, 0.21176471, 0.21176471],
[0.36078431, 0.18823529, 0.18431373],
[0.32941176, 0.16470588, 0.16862745]],
[[0.90980392, 0.73333333, 0.51764706],
[0.91372549, 0.7372549 , 0.52156863],
[0.91372549, 0.7372549 , 0.52156863],
...,
[0.38823529, 0.20784314, 0.20784314],
[0.35686275, 0.18431373, 0.18039216],
[0.3254902 , 0.16078431, 0.16470588]],
...,
[[0.78039216, 0.46666667, 0.32156863],
[0.78039216, 0.46666667, 0.32156863],
[0.78431373, 0.47058824, 0.3254902 ],
...,
[0.74117647, 0.38823529, 0.25490196],
[0.73333333, 0.38039216, 0.24705882],
[0.73333333, 0.38039216, 0.24705882]],
[[0.78039216, 0.46666667, 0.32156863],
[0.78039216, 0.46666667, 0.32156863],
[0.78039216, 0.46666667, 0.32156863],
...,
[0.7372549 , 0.38431373, 0.25098039],
[0.72941176, 0.37647059, 0.24313725],
[0.7372549 , 0.37254902, 0.24313725]],
[[0.78039216, 0.46666667, 0.32156863],
[0.78039216, 0.46666667, 0.32156863],
[0.78039216, 0.46666667, 0.32156863],
...,
[0.7372549 , 0.38431373, 0.25098039],
[0.7372549 , 0.37254902, 0.24313725],
[0.7372549 , 0.37254902, 0.24313725]]])
cat = plt.imread('cat.jpg')
plt.imshow(cat)
![这里写图片描述](https://img-blog.csdn.net/20180616200634611?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
# 下面我们在导入一张鱼的图片它是png格式图片
fish = plt.imread('fish.png')
# 假如我们现在要把鱼头放到猫的嘴的位置该怎么做呢?
# 先看鱼和猫图片的大小
fish.shape # (326,243,3)
cat.shape # (456,730,3)
# 先把鱼头用切片的办法,切出来
fish_head = fish[50:150,60:200]
# 然后在猫嘴的旁边找到一个 100*140 的区域,然后把鱼头的值赋给它
# 注意,fish是png格式的数据,其值是 0 - 1 的float32类型数据,需要先转换为uint8的数据
fish_head = (fish_head * 255).astype(np.uint8)
# 注意,这里猫图片数据类型有可能是只读类型,需要修改其属性变为可写,不然不可以修改
cat.flags.writeable = True
cat[330:430,260:400] = fish_head
plt.imshow(cat)
# 这样就实现了把鱼头放到猫嘴的操作,同理大家也可以找一下人物肖像进行换头手术
# 这个图片只是完成了简单的效果,如果要进行更加深入的操作,比如鱼头就是圆的,这就需要更加深入的
# 数据分析知识,还有图片颜色看着更加柔和的效果
![这里写图片描述](https://img-blog.csdn.net/20180616200650868?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
将这张图片切成5张图片呢,或者说本质就是将数据流切成几份
按照 y 轴来切
cata = cat[:120]
catb = cat[120:250]
catc = cat[250:]
plt.imshow(cata)
plt.show()
plt.imshow(catb)
plt.show()
plt.imshow(catc)
![这里写图片描述](https://img-blog.csdn.net/20180616200711899?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/2018061620072136?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180616200732932?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
按照 x 轴 来切
catax = cat[:, :120]
catbx = cat[:, 120:550]
catcx = cat[:, 550:]
plt.imshow(catax)
plt.show()
plt.imshow(catbx)
plt.show()
plt.imshow(catcx)
![这里写图片描述](https://img-blog.csdn.net/20180616200743647?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180616200754793?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180616200806142?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
将图片进行上下颠倒,和左右颠倒,以及颜色变换
实质就是改变了数据流的排列方式
上下颠倒
cat_top_to_bottom = cat[::-1]
plt.imshow(cat_top_to_bottom)
![这里写图片描述](https://img-blog.csdn.net/20180616200817649?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
左右颠倒
cat_right_to_left = cat[:,::-1]
plt.imshow(cat_right_to_left)
# 注意鱼眼睛跑到左边去了
![这里写图片描述](https://img-blog.csdn.net/20180616200828804?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
颜色变换
cat_color_change = cat[:,:,::-1]
plt.imshow(cat_color_change)
![这里写图片描述](https://img-blog.csdn.net/20180616200839997?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
将两张图片拼起来,即将两个数组连接起来
# 为了方便拼接,再导入一张格式和猫一样的dog图片
dog = plt.imread('dog.jpg')
dog.shape # (300, 313, 3) 狗图片比猫图片小,为了拼接需要对锚图片进行裁剪切片
new_cat = cat[100:400,200:513]
# 使用 numpy.concatenate()函数可以将ndarray的数组级联起来,包括垂直和水平级联
# 此函数的默认参数axis=0,表示垂直级联, axis=1,表示水平级联,也可以说 axis=n表示将第n维数据进行级联
# 并且需要级联的对象要放入到一个元组中作为参数传入,对象在元组中的顺序即级联的顺序
cat_dog_vertical = np.concatenate((dog,new_cat))
cat_dog_horizontal = np.concatenate((dog,new_cat,dog),axis=1)
plt.imshow(cat_dog_vertical)
plt.show()
plt.imshow(cat_dog_horizontal)
![这里写图片描述](https://img-blog.csdn.net/2018061620085459?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![这里写图片描述](https://img-blog.csdn.net/20180616200904880?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNzcyOTk3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
通过上面对一张猫的图片的反复操作,我们已经对数据分析,处理有了初步的了解,现在我们系统的对 ndarray | Series | DataFrame几种类型进行深入的了解
首先先看cat的数据类型
type(cat) # numpy.ndarray 类型,这是一种特殊的数组类型,可以有许多的操作
numpy.ndarray
一. numpy.ndarray数组类型
A 生成方式
1. 从Python的数据结构列表,元组等直接转换
nd = np.array([4,5])
nd1 = np.array(([1,2],[3,2],[1,3]))
nd2 = np.array((1,2,3,4,'a','b'))
display(nd,nd1,nd2)
array([4, 5])
array([[1, 2],
[3, 2],
[1, 3]])
array(['1', '2', '3', '4', 'a', 'b'], dtype=' |