利用Python进行数据分析之Numpy学习笔记(一)

NumPy

首先说一下这篇文章不是NumPy的教程,而是对学习的记录,旨在在以后需要用的时候能够知道What is NumPy。镇上官方NumPy参考手册,这才是系统学习NumPy的真正去处。

约定:

import numpy as np

简介:

NumPy(Numerical Python)是高性能科学计算和数据分析的基础包。NumPy的主要对象是同构数据多维容器(homogeneous multidimensional array)——ndarray,也就是说每一个ndarray都是一个相同类型元素组成的表格(二维)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。这个概念必须牢记,否则放弃吧。首先轴是从0开始计的,0代表最高维,次高维是1,以此类推。

还有两个概念需要认识:

  • 面向数组——NumPy本身并没有提供多么高级的数据分析功能,理解NumPy数组以及面向数组的计算将有助于你更加高效地使用诸如pandas之类的工具。
  • 矢量化(vectorization)——用数组表达式代替循环的做法。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多),尤其是各种数值计算。

ndarray属性

  1. ndarray.ndim——ndarray的秩。
  2. ndarray.shape——书面意思ndarray的形状。官方解释是各维度的大小所组成的tuple元组。
  3. ndarray.size——数组元素的总个数,等于shape属性中元组元素的乘积。
  4. ndarray.dtype——是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息。ndarray内部由一个指向数组的指针,一个数据类型,一个表示形状的元组和一个跨度元组(跨越某一维度所需字节数)。由于NumPy关注的是数值计算,所以没有特别指定,dtype基本都是float64(浮点数),果然是基本,np.arange(10)产生的数组类型是int32,嗯,推断的还算合理吧。
  5. ndarray.itemsize——书面意思项大小,就是数组中每一个元素所占字节大小。
  6. ndarray.data——官方说不需要使用,so 没细研究。

创建ndarray

函数 说明
np.array(data,dtype=None, order=None) 将数据data(列表、元组、数组或其他序列类型)转换为ndarray。要么推断出dtype,要么显示指定dtype。默认直接复制数据。order默认是A(可能是C可能是F还可能是其它)
np.asarray(data, dtype=None, order=None) 将输入数据转换为ndarray,data同上还可以是ndarray,如果是ndarray就不进行复制。dtype同上,order是重塑中行优先C还是列优先F,默认C语言风格。
np.arange(10,30,5,dtype=None) 开始,结束,步长和内置的range相同
np.ones( (2,3,4), dtype=None) 、np.ones_like(a) 根据指定的形状和dtype创建一个全1的数组。ones_like以另一个数组为参数,创建形状和dtype相同的全1数组。
np.zeros() 、np.zeros_like() 全0数组,类似ones和ones_like。
np.empty() 、np.empty_like() 创建数组,只分配内存空间但不填充任何值,所以返回的是垃圾值。类似ones和ones_like。
np.eye(N, M=None, k=0, dtype=<type 'float'>) 、np.identity(n, dtype=None) eye创建的是N*M的数组,默认M=N,k取整数,正数对角线向上移k,负数对角线向下移k。identity创建一个N*N单位矩阵(\对角线为1,其余全0)的数组

操作

算术运算

大小相等的数组之间的任何算术运算都会将运算应用到元素级。

数组与标量的算术运算也将会将那个标量值传播到各个元素。

当dtype不一致时,采用上溯造型(upcasting)

逻辑运算

<、>、<=、>=、==、!=和&(和)、|(或)、-(非),这些运算符和算术运算符的使用一致,只不过将产生一个新的布尔型数组。

集合运算

NumPy提供了一些针对一维ndarray的基本集合运算。

函数 说明
np.unique(x, return_counts=False) 计算x中的唯一元素,并返回有序数组, return_counts=True时一并返回对应元素的数量数组。
np.intersect1d(x,y) ()计算x,y中的公共元素,并返回有序数组
np.union1d(x,y) ()计算x,y的并集,并返回有序数组
np.in1d(x,y) (包含)得到一个表示x的元素是否包含于y的布尔型数组
np.setdiff1d(x,y) ()集合的差,即元素在x中且不在y中
np.setxor1d(x,y) (异或)集合的对称差,即存在于一个数组中但不同时存在于两个数组中的元素。
索引

索引这一节一句半句说不清,另起一篇来写。

形状操纵

reshape(x,y,...)返回修改的新数组,resize((x,y,...))返回修改后的自身。

转置:

转置(transpose)是重塑的一种特殊形式它返回的是源数据的视图。数组不仅有transpose方法,还有一个特殊的T属性。简单的转置可以使用.T,他其实就是进行轴对换而已。ndarray还有一个swapaxes方法,他需要接受一对轴编号eg:swapaxes(0,1)。对于高维数组transpose需要一个轴编号组成的元组才能对这些轴进行转置。

这里对transpose解释一下

In [4]: arr = np.arange(16).reshape((2,2,4))

In [5]: arr
Out[5]:
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]],

       [[ 8,  9, 10, 11],
        [12, 13, 14, 15]]])

In [6]: arr.transpose((1,0,2))
Out[6]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])
简而言之就是将原来的0,1,2轴变成现在的1,0,2,转换后的0轴是原来的1轴,转换后的1轴是原来的0轴,2轴未变。
换种解释:比如说8元素的索引是[1,0,0],0,1轴变换后是[0,1,0]。

组合不同的数组(堆stack):

hstack, vstack, column_stack, concatenate, c_, r_

其他

用于数组的文件输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。

np.save和np.load是读写磁盘数组数据的两个主要函数。默认情况下,数据是以未压缩的原始二进制格式保存在扩展名为.npy的文件中的。如果文件路径末尾没有扩展名.npy,则该扩展名会被自动加上。通过np.savez可以将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可np.savez('array_archive.npz',a=arr1, b=arr2),加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加载。

NumPy提供了从文件中加载文本的函数np.loadtxt(),还有更为专门化的np.genfromtxt()将数据加载到普通的NumPy数组中,只不过他面向的是结构化数组和缺失数据处理。这些函数都许多选项可供使用:指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。完整版的np.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0),注解默认‘#’,分隔符默认whitespace空白,converters = dict{columu : function}。np.savetxt()执行的是相反的操作。

复制和视图

简单的赋值不拷贝数组对象或者他们的数据;视图就是同一数据的引用,改视图,就是改数据;切片返回的是视图。显示复制用copy()函数。其实考虑一下NumPy工具出现的目的也能明白,能够高效、快速处理大量数据,老是复制多费劲,还占内存。


如有理解不正确之处或者解释不通的地方,欢迎指正,共同进步,有时候个人的理解并不能解释忽略的、更高层面情况。

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

推荐阅读更多精彩内容