python数据分析基础:numpy

numpy是python高性能科学计算和数据分析的基础包,python的很多其他库都构建在numpy之上,因此你要用python做数据分析与挖掘都最好先学一下numpy的基本操作(当然要学numpy首先要把python语言本身的基本操作要学一下),这也是我看吴恩达神经网络基础课程的感受,否则听的时候可能听懂了,但是写代码的时候,发现下不了手,甚至就算看着别人的代码来写,也总感觉很模糊。

python语言提供了list容器,而ndarray是numpy提供的多维数组对象,拥有一系列好用的属性和方法,因为我装的是anaconda,numpy等常用科学计算包都是是默认安装的,所以可以直接引入numpy包

import numpy as np

创建ndarray

通过numpy提供的array函数np.array(data,dtype=np.int32)可以创建ndarray,同时可以指定元素数据类型,如不指定,numpy会自己推断较合适的数据类型,对于大数据集,一定要关注自己的数据类型,如图像的像素值都是0-255之间的数,因此用无符号的8位就够了,但如果用4个字节的int,每个像素点就会浪费3个字节,一张64*64的图片就会浪费12288个字节,即12kb,这对于大数据集是非常可怕的。具体有哪些数据类型这里不作介绍,需要的时候去查就好了。

# 一维
data = [1, 2, 3, 4, 5];
arr = np.array(data)
# 二维
data = [
    [1, 2, 3, 4],
    [4, 5, 6, 7]
]
arr = np.array(data)
# 三维 以64*64*3图片为例,64*64表示长宽,3表示每个像素的rgb值
data = [
     // 一列或一行
     [
          [120, 255, 0], //每一列或每一行的每个像素点
          [110, 123, 1],
          ... # 共64个
     ],
     [
          [130, 205, 0],
          [160, 123, 1]
     ],
     ... # 共64个
]
# n维同理

除此之外,numpy也提供了一些方法来创建一些经常用到的数组。

# 创建10个元素全为0的数组
np.zeros(10)
# 创建3*6的全为0的数组
np.zeros((3,6))
# 创建10个元素全为1的数组
np.ones(10)
# 创建2*3的随机数组
arr = np.random.random((2,3))
# 创建从0-14的整数数组
np.arange(15)
# 创建一个10*10单位矩阵,即左上到右下的对角线元素为1,其余全为0
np.eye(10)

ndarray常用属性

以上文中提到到图片三维ndarray为例

# ndaray的维度
print(arr.ndim)  # 因为是三维 所以是3
# ndarray的形状
print(arr.shape) # (64,64,3)
print(arr.shappe[0]) # 64
# ndarray所有元素的个数
print(arr.size) # 64*64*3 = 12288
# ndarray的数据类型
print(arr.dtype) # int32

ndarray索引和切片

数组索引即如何找到数组中的元素,ndarray数组索引除了支持标量,同时还支持切片,以及花式索引(这里不作介绍)。再说切片之前,先说"轴",一个ndarray至少有一个轴,一维只有一个x轴,二维的话有x轴和y轴,三维再加一个z轴,多维同理。有n个维度,则最多支持n个索引。如三维数组,可以通过arr[a]、arr[a][b]或者arr[a,b]、arr[a][b][c]或者[a,b,c]取到某个特定的元素。
a,b,c除了可以为具体的数字,也可以为一个切片。和python中的list一样,通过冒号:表示切片,只有:表示整个轴。:前后都可以写数字,如1:5,表示这个轴上从1到5的元素,1:则表示这个轴上从1到最后一个元素:6则表示这个轴上从0到第6个元素,元素可能是一个标量也可能是一个子数组,示例如下:

arr = np.arange(10)
print(arr) # [0,1,2,3,4,5,6,7,8,9]
print(arr[3]) # 3
print(arr[:]) # 一维只有一个x轴,因此输出 [0,1,2,3,4,5,6,7,8,9]
print(arr[3:5]) # x轴上3-5的元素 输出 [3,4]
# 二维数组
arr = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
print(arr[0]) # [1,2,3,4]
print(arr[:]) 
print(arr[:,:])
# 上面这俩条都会返回整个array
print(arr[1,2:]) # 第一维度上的第一个元素,从第0个开始到最后一个元素 即 [7,8]
print(arr[:2]) # 第一个维度从0到第2个元素 即 [ [1,2,3,4], [5,6,7,8] ]
print(arr[:2,:1]) # [[1],[5]]

需要注意的是,ndarray中的切片都是原数组的视图,因此对切片的任何操作都会体现到原数组中,如果需要拷贝数组,需要显示的调用copy函数。示例如下

arr = np.arange(10)
print(arr) # [0,1,2,3,4,5,6,7,8,9]
print(arr[3:5]) # [3,4]
arr[3:5] = 12 # 修改切片同时会修改原数组
print(arr[3:5]) # [12,12]
print(arr) # [0,1,2,12,12,5,6,7,8,9]
copy = arr.copy()
copy[3:5] = 8
print(copy) # [0,1,2,8,8,5,6,7,8,9]
print(arr) # [0,1,2,12,12,5,6,7,8,9]

ndarray运算

大小相等的数组的数组之间的任何运算都会应用到元素级别。例如:

arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[1,2,3],[4,5,6]])
print(arr1*2) # [[2,4,6],[8,10,12]]
print(arr1+arr2) # [[2,4,6],[8,10,12]]
print(arr1*arr2) # [[1,4,9],[16,25,36]]

ndarray常用函数

有些是在numpy命名空间下的,有些则是要通过具体的数组对象来调用,,有的则都可以。下文中,np.func()表示在numpy命名空间下,arr.func()则表示通过具体数组对象调用。
数组重塑 arr.reshape(newshape) 参数为一个表示新数组形状的元组。作为参数形状的其中一维可以是-1,表示该维度大小由数据本身推断而来。示例如下:

arr = np.arange(15).reshape(3,5)
print(arr)
# [
#      [0,1,2,3,4],
#      [5,6,7,8,9],
#      [10,11,12,13,14]
# ]
arr = np.arange(15).reshape(3,-1)
# 输出和上面的一样

数组转置arr.transpose() 无参数,也可以直接用T属性表示,如arr.T表示arr的转置。如果你还记得线性代数,那么转置矩阵听起来一定很耳熟二维数组转置比较好理解,即行变成列,列变成行。三维及其以上稍微复杂点,这里不介绍。
矩阵点乘 np.dot(x,y) 或者 arr.dot(arr.T) 这也是专门针对线性代数提供的函数,关于点乘,等同于线性代数里的矩阵乘法,因此要满足前一个矩阵A的列数等于后一个矩阵B的行数,矩阵乘法才有意义
除了dot函数,还有其他针对线性代数的函数,但这个在后面的代码中会经常用到。
arr.sort()排序函数
常用的数学计算以及分析统计函数
这个有很多,最常见的如求和,求平均值,求方差,标准差,指数,对数等。需要做统计和计算的时候,先查下API文档,看有没有官方提供的函数。能用numpy函数的就用函数,尽量不要自己写循环处理数组,numpy数组的性能是非常好的。
以上并不是numpy数组的全部知识,只是我看了吴恩达神经网络基础课程认为当下上手编写代码需要具备的知识。

主要参考资料:利用python进行数据分析

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

推荐阅读更多精彩内容

  • 暴力离婚,两个诈骗诉讼(冯超诈骗),两个法律顾问,一个刑事拘留(销售假药罪),还有一个是劳动纠纷,3份律师函(开...
    昨日蒙冉阅读 118评论 0 0
  • 引言 首先我是一个菜鸡,对redux的掌握还只是停留在能使用层面,这里只是记录一下我的这个react博客的redu...
    ape_caesar阅读 559评论 2 0
  • 我是个追剧从来没坚持过的人,起码这几年都是这样,看没几集就放弃了,可是这个剧我已经坚持到了现在。 后来想了想,可能...
    燊寒阅读 364评论 2 1