数据分析-numpy

指定数据类型

a = numpy.array(range(6), dtype=numpy.int8)

指定数据类型为int8

numpy数组的形状

使用方法(ipython3)

In [2]: import numpy

In [3]: numpy.arange(1,6)
Out[3]: array([1, 2, 3, 4, 5])

In [4]: numpy.array(range(1,6))
Out[4]: array([1, 2, 3, 4, 5])

In [5]: numpy.array([1,2,3,4,5])
Out[5]: array([1, 2, 3, 4, 5])

In [6]: a = numpy.arange(1,6)

In [7]: b = numpy.array(range(1,6))

In [8]: c = numpy.array([1,2,3,4,5])

In [9]: type(a)
Out[9]: numpy.ndarray

In [10]: type(b)
Out[10]: numpy.ndarray

In [11]: type(c)
Out[11]: numpy.ndarray
shape方法
In [6]: a = numpy.arange(1,6)

In [12]: a.shape
Out[12]: (5,)
In [15]:  d = numpy.array([[1,2,3], [4,5,6]])

In [16]: d.shape
Out[16]: (2, 3)
In [17]: e = numpy.array([[1,2,3], [4,5,6],[7,8,9]])

In [18]: e.shape
Out[18]: (3, 3)

shape得到的元组中,几个元素代表几位数组。

reshape

把一个一行的数组变成一个3行四列的数组

In [23]: a
Out[23]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

In [24]: a.reshape((3,4))
Out[24]:
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

reshape不会对数据本身进行修改,而是会返回重新组合的数组。

flatten

将多维数组展开

In [38]: a
Out[38]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
In [39]: a.flatten()
Out[39]:
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])

numpy数组的计算

In [50]: a
Out[50]:
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]])

In [51]: a * 2
Out[51]:
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]])

数组会对其中的所有元素做计算操作。
数组和数组的计算:

In [50]: a
Out[50]:
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]])
In [54]: b
Out[54]:
array([[100, 101, 102, 103, 104, 105],
       [106, 107, 108, 109, 110, 111],
       [112, 113, 114, 115, 116, 117],
       [118, 119, 120, 121, 122, 123]])
In [53]: a + b
Out[53]:
array([[100, 102, 104, 106, 108, 110],
       [112, 114, 116, 118, 120, 122],
       [124, 126, 128, 130, 132, 134],
       [136, 138, 140, 142, 144, 146]])

对应位置的元素进行计算。
数组和形状不同的数组进行计算:

In [56]: c
Out[56]: array([0, 1, 2, 3, 4, 5])
In [57]: b - c
Out[57]:
array([[100, 100, 100, 100, 100, 100],
       [106, 106, 106, 106, 106, 106],
       [112, 112, 112, 112, 112, 112],
       [118, 118, 118, 118, 118, 118]])

In [58]: d = numpy.arange(4).reshape((4,1))

In [59]: d
Out[59]:
array([[0],
       [1],
       [2],
       [3]])

In [60]: b - d
Out[60]:
array([[100, 101, 102, 103, 104, 105],
       [105, 106, 107, 108, 109, 110],
       [110, 111, 112, 113, 114, 115],
       [115, 116, 117, 118, 119, 120]])

当某一维度是相同的时候,他们是可以计算的。
通过不同形状的数组计算,我们可以计算每行或者每列元素对不同值加减的运算。

轴(axis)

一维数组:0轴(列)
二维数组:0轴、1轴(行、列)
三维数组:0轴、1轴、2轴(块、行、列)

numpy读取数据

一般不用。

np.loadtxt(fname, dtype=float, comments='#', delimiter=None,
converters=None, skiprows=0, usecols=None, unpack=False,
ndmin=0, encoding='bytes')

参数 解释
fname 文件、字符串或产生器,可以使.gz或bz2压缩文件
dtype 数据类型、可选,CSV的字符串以什么数据类型读入数组中,默认np.float
delimiter 分割字符串,默认是任何空格,改为逗号
skiprows 调过前x行,一般跳过第一行表头
usecols 读取指定的列,索引,元组类型
unpack 如果True,读入属性将分别写入不同的数组变量,False读入数据只写入一个数组变量,默认False(转置,对角线旋转180°)
转置
In [65]: b
Out[65]:
array([[100, 101, 102, 103, 104, 105],
       [106, 107, 108, 109, 110, 111],
       [112, 113, 114, 115, 116, 117],
       [118, 119, 120, 121, 122, 123]])

In [66]: b.T
Out[66]:
array([[100, 106, 112, 118],
       [101, 107, 113, 119],
       [102, 108, 114, 120],
       [103, 109, 115, 121],
       [104, 110, 116, 122],
       [105, 111, 117, 123]])

行变列,列变行,沿对角线旋转180°即是结果。

numpy索引和切片

import numpy as np

uk_file_path = "./youtube_video_data/US_video_data_numbers.csv"

t2 = np.loadtxt(fname=uk_file_path,dtype='int',delimiter=',')
print(t2)
print('*' * 100)
# 取第二行
print(t2[2])
# 取第二行开始后面的每一行
print("*" * 100)
print(t2[2:])
# 取第2、4、8行
print("*" * 100)
print(t2[[2,4,8]])
# 取列
print("*" * 100)
print(t2[:,0])
# 取第二列开始后面的每一列
print("*" * 100)
print(t2[:,2:])
# 取第0、2列
print("*" * 100)
print(t2[:,[0,2]])
# 取1-3行,2-4列交集的数组
print("*" * 100)
print(t2[0:3,1:4])
# 取多个不相邻的点
# 选出来的结果是(0,0)和(2,1)即行列对应点
print("*" * 100)
print(t2[[0,2],[0,1]])

numpy数值的修改

如,获取b中大于105的值:

In [67]: b
Out[67]:
array([[100, 101, 102, 103, 104, 105],
       [106, 107, 108, 109, 110, 111],
       [112, 113, 114, 115, 116, 117],
       [118, 119, 120, 121, 122, 123]])
In [68]: b > 105
Out[68]:
array([[False, False, False, False, False, False],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True]])
In [69]: b[b>105]
Out[69]:
array([106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118,
       119, 120, 121, 122, 123])

将大于110的值变成110

In [70]: b[b>110] = 110

In [71]: b
Out[71]:
array([[100, 101, 102, 103, 104, 105],
       [106, 107, 108, 109, 110, 110],
       [110, 110, 110, 110, 110, 110],
       [110, 110, 110, 110, 110, 110]])
使用where
np.where(t<10,0,10)
使用clip
t.clip(10,18)

把小于10的替换成10,大于18的替换成18

astype

改变数组的数值类型

In [72]: b.astype(float)
Out[72]:
array([[100., 101., 102., 103., 104., 105.],
       [106., 107., 108., 109., 110., 110.],
       [110., 110., 110., 110., 110., 110.],
       [110., 110., 110., 110., 110., 110.]])

In [74]: b = b.astype(float)
In [75]: b[1,3] = numpy.nan

In [76]: b
Out[76]:
array([[100., 101., 102., 103., 104., 105.],
       [106., 107., 108.,  nan, 110., 110.],
       [110., 110., 110., 110., 110., 110.],
       [110., 110., 110., 110., 110., 110.]])

数组的拼接

np.vstack((t1,t2)) 竖直拼接
np.hstack((t1,t2)) 水平拼接

数组的行列交换

In [86]: c
Out[86]:
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],
       [ 4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21],
       [22, 23, 24, 25, 26, 27]])

In [87]: c[[1,4],:] = c[[4,1],:]

In [88]: c
Out[88]:
array([[ 0,  1,  2,  3,  4,  5],
       [ 4,  5,  6,  7,  8,  9],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [ 6,  7,  8,  9, 10, 11],
       [10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21],
       [22, 23, 24, 25, 26, 27]])
创建一个全部为0的数组
np.zeros((3,4))
创建一个全部为1的数组
np.ones((3,4))
创建一个对角线为1的数组(参数是行列数)
np.eye(3)
获取最大值最小值的位置
In [94]: a
Out[94]:
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]])

In [95]: b
Out[95]:
array([[ 4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21],
       [22, 23, 24, 25, 26, 27]])

In [96]: numpy.argmax(a, axis=0)
Out[96]: array([3, 3, 3, 3, 3, 3])

In [97]: numpy.argmin(a, axis=0)
Out[97]: array([0, 0, 0, 0, 0, 0])

In [98]: a
Out[98]:
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]])

In [99]: numpy.argmin(a, axis=1)
Out[99]: array([0, 0, 0, 0])

In [100]: numpy.argmax(a, axis=1)
Out[100]: array([5, 5, 5, 5])

axis = 0 表示取出每一列最大值的位置,即结果,每一列最大值的位置在第3行
axis = 1 表示取出每一行最大值的位置,即结果,每一行最大值的位置在第5列

numpy的随机数

参数 解释
.rand(d0,d1,...dn) 创建d0-dn维度的均匀分布的随机数数组,浮点数,范围从0-1
.randn(d0,d1,...dn) 创建一个d0-dn维度的标准正态分布随机数,浮点数,平均数0,标准差1
.randint(low,high,(shape)) 从给定上下线范围选取随机数整数,范围是low,high,形状是shape
.uniform(low,high,(size)) 产生具有均匀分布的数组,low起始值,high结束值,size形状
.normal(loc,scale,(size)) 从指定正态分布中随机抽取样本,分布中心是loc,概率分布的均值,标准差是scale,形状是size
.seed(s) 随机数种子,s是种子值,只要给定的S相同,每次生成的都是相同的随机数

numpy中的nan和inf

nan(NAN,Nan): not a number 表示不是一个数字
inf(-inf\inf):infinity,inf表示正无穷,-inf表示负无穷
两者都是浮点类型

判断数组中NAN的个数:
首先要用到一个方法

numpy.count_nonzero()

统计数组中非零元素的个数
然后我们先获取到一个新的数组:a!=a
当a数组如下时:

In [110]: a
Out[110]:
array([[ 0.,  1.,  2.,  3.,  4.,  5.],
       [ 6.,  7.,  8.,  9., 10., 11.],
       [12., 13., 14., 15., nan, 17.],
       [18., 19., 20., 21., 22., 23.]])

其中有一个NAN,但是nan总是不相等的,即numpy.nan != numpy.nan
所有,我们利用a!=a,可以得到一个bool类型数组,相同的为False,不相同的为True

In [109]: a != a
Out[109]:
array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False,  True, False],
       [False, False, False, False, False, False]])

False = 0,True = 1
所以:

In [111]: numpy.count_nonzero(a!=a)
Out[111]: 1

显示出,数组中有一个NAN元素。
a!=a还可以用另一种方式得到:

In [112]: numpy.isnan(a)
Out[112]:
array([[False, False, False, False, False, False],
       [False, False, False, False, False, False],
       [False, False, False, False,  True, False],
       [False, False, False, False, False, False]])

一般在数组中有NAN的时候,我们一般替换NAN的值为中值或者均值。

numpy中常用额的函数

函数名称 作用
t.sum(axis=None) 求和
t.mean(axis=None) 均值
np.median(t,axis=None) 中值
t.max(axis=None) 最大值
t.min(axis=None) 最小值
np.ptp(axis=None) 极值,最大值和最小值之差
t.std(axis=None) 标准差,反应数值波动大小的程度
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容