数据分析-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) 标准差,反应数值波动大小的程度
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容