使用python进行数据分析<四>(Numpy基础:数组和矢量计算)

Numpy: 一个高性能科学运算和数据分析的基础包. 部分基础功能如下:

Numpy的ndarray :一个多维数组对象

ndarray,一个具有矢量算数运算和复杂广播能力的多维数组. 其中的元素必须是同一个类型. 每个ndarray 都有一个shape记录各维度带下的元组, 一个dtyepe,记录元素类型

创建ndarray对象

  1. nu.array
dat1 = [5,6,57,56,7,657,56,7]
array1 = np.array(dat1)
  • 使用np.zeros()创建一个所有元素为0的ndarray
    使用np.ones()创建一个所有元素为1的ndarray
    使用np.empty()创建一个没有任何具体值的ndarray


    image.png
  1. array1.astype(np.float64) 转化array中的数据类型.

  2. ndarray可以和标量进行数据运算. 如array1 * array1 1/array1. 会将运算作用于每一个元素

  3. ndarray支持切片和下标. 不同的是 切片并不会复制出一个新的数组,而是会反映到原数组上. 如果要复制,可以显式的调用copy() ,如: arr[2:4].copy()

  4. 对多维数组的切片,同理. 逐渐深入. array[1:3,:3]

  5. 布尔型索引 : 表达式为 array[ array < 0 ] = 1; ndarra 独有的运算方法. python中的list并不具备. 在中括号的表达式中,使用结果为bool的表达式.

  6. 花式索引 Numpy的一个名词. 对于一个二维的ndarray来说, array[ x ] = 1. 如果x为一个索引. array中的第x个数组中的每个元素赋值为1. 如果x为一个list. 如[1,2,3]. 以list中的每个元素作为下标从array中取出对应的数组, 数组中的每个元素赋值. 如果不进行赋值,就会选取出特定的数组.

  7. 花式索引传入多个list, list用,分割那么,首先array使用第一个list,截取出对应的数组, 然后使用第二个list,以第二个list中元素作为索引,取出相对应数组中的元素.

array4 = np.arange(32).reshape((8,4))

In [71]: array4
Out[71]: 
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],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
In [75]: array4[[3,4],[1,2]]
Out[75]: array([13, 18])
In [84]: array4[:1,[3,2,1,0]] # :1,代表切片. [3,2,1,0]代表根据idnex取对应的值
Out[84]: array([[3, 2, 1, 0]])

总结: ndarray[] ,可以传入切片,list. index. 根据传入的顺序, 第一个参数用作选取对应的数组. 如果第一个参数是list,第二个参数也是list.那么参照上面第8条. 如果第一个是index或者切片,那么会对每一个数组执行取值排序.
所以说只有两个参数都为list的时候,才会根据返回一个数组. 其他都是对每一个数组做操作

  1. ndarray的索引,总是把数据复制到一个新的数组中.
  2. 二维数组可以看做是矩阵. np.dot() 用来计算矩阵的乘法.
数组转置和轴对换

这个有点不好理解. 看了这篇回答才略微明白一点.

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

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

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


In [136]: array8=array7.transpose((1,0,2))

In [137]: array8
Out[137]: 
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])

  1. 创建一个三维数组array7. 此时array7有一个属性x的置默认为 (0,1,2).
  2. array7调用transpose函数,并传入参数(1,0,2), 也就是 0和1的位置调换.
  3. 比如在array7中,4的位置为 array7[0][1][0],那么在transpose后的新的数组中, 4的位置要是array[1][0][0]. 就是第一个索引值和第二个索引值的位置互换.
  4. .T属性返回的值,就是把顺序全部调换的结果. 比如把(0,1,2)变为(2,1,0) . 所以arrray7.T和array7.transpose((2,1,0))的结果是一样的
  5. swapaxes,就收两个参数,把两个索引上的元素互换 . 所以arrat7.swapaxes(1,2) 和 array7.transpose((0.2.1))的结果是一样的
通用函数
利用数组进行数据处理

Numpy数组将循环简化为数组表达式, 称为矢量化

import numpy as np
import matplotlib.pyplot as plt

points = np.arange(-5,5,0.01)


# np.meshgrid函数接受两个以为数组,并且产生两个二维矩阵,对应两个数组中所有的(x,y)对
 xs,ys = np.meshgrid(points,points)

z = np.sqrt(xs**2 + ys**2)
plt.imshow(z,cmap=plt.cm.gray);
plt.colorbar()
plt.show()

将条件逻辑表述为数据表达式 where

where(b,x,y) == b?x:y

In [171]: xarr = np.array([1.1,1.2,1.3,1.4])

In [173]: yarr = np.array([2.1,2.2,2.3,2.4])

In [174]: cond = np.array([True,False,True,False])

In [175]: results = np.where(cond,xarr,yarr)

In [176]: results
Out[176]: array([1.1, 2.2, 1.3, 2.4])

数学和统计学方法
image.png

这些函数既可以使用array调用,也可以当做Numpy的顶级函数使用. 函数可以接受一个(axis = )的参数,用于计算该轴向上的统计结果.
cumsum和sumprod不聚合,产生一个等大的数组.
其他聚合,产生一个降一维度的数据

集合逻辑
image.png
将数据以二进制格式保存在磁盘
#保存
In [177]: arr = np.arange(10)

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

In [180]: np.save('one_array',arr)

#读取
In [182]: read_arr = np.load('one_array.npy')

In [183]: read_arr
Out[183]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

#保存多个数组并压缩到一个文件
In [184]: arr1 = np.arange(5)
In [186]: np.savez('z_array',a=arr,b=arr1)

#读取多个数组
In [187]: new_arr = np.load('z_array.npz')

In [188]: new_arr
Out[188]: <numpy.lib.npyio.NpzFile at 0x10fc54eb8>

In [189]: new_arr['a']
Out[189]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

注意单个数组格式为.npy,多个数组压缩的格式为.npz

线性代数相关
image.png

这些函数,有的是np下的顶级函数, 有的是linalg下的函数

from numpy.linalg import inv,qr
随机数生成

numpy.random模块对python内置的random进行补充,增加一些用于生成多种概率分布的样本值的函数.


In [204]: samples = np.random.normal(size=(4,4))
In [206]: samples
Out[206]: 
array([[ 0.46229648, -0.20647171, -0.00566354,  0.32823414],
       [-0.45247886,  0.50668721, -1.20578395, -0.19447529],
       [ 0.27184016,  0.74032391, -0.75409531,  1.25058692],
       [ 0.35639571, -0.45157067,  0.24709158,  2.4726017 ]])

image.png
使用numpy批量生成随机数
In [207]: nsteps = 1000
#生成1000个随机数
In [208]: draws = np.random.randint(0,2,size=nsteps)
#根据随机数生成 1 或者 -1 的stpes ndarray
In [210]: stpes = np.where(draws > 0,1,-1)


#如果想要一性生成多个,只需要size参数传入一个元组

In [215]: draws = np.random.randint(0,2,size=(5000,1000))

In [216]: steps = np.where(draws > 0,1,-1)
In [217]: steps
Out[217]: 
array([[-1, -1,  1, ...,  1,  1, -1],
       [-1, -1, -1, ...,  1, -1, -1],
       [ 1,  1,  1, ...,  1,  1, -1],
       ...,
       [ 1, -1,  1, ...,  1, -1,  1],
       [ 1, -1, -1, ..., -1,  1, -1],
       [ 1,  1,  1, ..., -1, -1, -1]])

In [218]: steps.cumsum(1)
Out[218]: 
array([[ -1,  -2,  -1, ...,  28,  29,  28],
       [ -1,  -2,  -3, ...,   0,  -1,  -2],
       [  1,   2,   3, ..., -50, -49, -50],
       ...,
       [  1,   0,   1, ..., -24, -25, -24],
       [  1,   0,  -1, ...,  52,  53,  52],
       [  1,   2,   3, ...,  16,  15,  14]])

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

推荐阅读更多精彩内容