Python学习笔记---NumPy模块

数组

☆创建
import numpy as np
函数,np.func()

In [38]: data = [1,2,3,4,5]

In [39]: arr1 = np.array(data)#.array()

In [40]: arr1
Out[40]: array([1, 2, 3, 4, 5])

In [41]: data2 = [2,3,4,5,6]

In [43]: arr2 = np.array([data,data2])#多维数组

In [44]: arr2
Out[44]:
array([[1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6]])

In [81]: arr2[0]#在一个二维数组中,各索引位置上的元素不再是标量而是一维数组
Out[81]: array([1, 2, 3, 4, 5])

In [82]: arr2[0][0]#访问元素法一
Out[82]: 1

In [83]: arr2[0,0]#访问元素法二
Out[83]: 1

In [45]: arr2.ndim#维度个数
Out[45]: 2

In [46]: arr2.dtype#数据类型
Out[46]: dtype('int64')

In [47]: np.zeros(10)#np.zeros()创建均为0的数组
Out[47]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

In [48]: np.ones(10)#创建均为1的数组
Out[48]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

In [50]: np.empty(4)#创建新数组,只分配内存但不填充任何值,返回的是一些未初始化的垃圾值
Out[50]: array([6.91882394e-310, 1.92084107e-316, 5.59638180e+199, 3.77477185e-128])

In [51]: np.arange(5)#类似于python内置函数range()
Out[51]: array([0, 1, 2, 3, 4])

In [52]: n = np.array(['1.25','-9.6','42'],dtype=np.string_)#自定义数据类型

In [53]: n.astype(float)#转换数据类型
Out[53]: array([ 1.25, -9.6 , 42.  ])

☆基本索引和切片
与Python列表的功能类似,但是数组切片是原始数组的视图,这意味着数据不会复制,视图上的任何修改都会直接反映到源数组上。

In [68]: arr = np.arange(10)

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

In [70]: arr_slice = arr[5:8]#切片--视图--同源

In [71]: arr_slice[1] = 123

In [72]: arr#视图改变源改变
Out[72]: array([  0,   1,   2,   3,   4,   5, 123,   7,   8,   9])

In [73]: arr_slice[:] = 64#一个值可赋给多个

In [74]: arr
Out[74]: array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])

In [75]: arr = np.arange(10)

In [76]: copy = arr[5:8].copy()#副本,无关

In [77]: copy[1] = 123

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

切片索引
跟Python列表这样的一维对象差不多

In [85]: arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])

In [86]: arr2d
Out[86]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [87]: arr2d[:2]#沿着第0轴即第一个轴切片
Out[87]:
array([[1, 2, 3],
       [4, 5, 6]])

In [88]: arr2d[:2,1:]
Out[88]:
array([[2, 3],
       [5, 6]])

In [89]: arr2d[1,:2]
Out[89]: array([4, 5])

In [90]: arr2d[:,:1]
Out[90]:
array([[1],
       [4],
       [7]])

In [91]: arr2d[:2,:1]=0#对切片表达式的赋值操作也会被扩散到整个选区+

In [92]: arr2d
Out[92]:
array([[0, 2, 3],
       [0, 5, 6],
       [7, 8, 9]])

布尔型索引

In [131]: data = np.random.randn(3,4)#生成3*4的正态分布的随机数据

In [132]: data
Out[132]:
array([[-1.75188112, -0.97473529, -0.92438864, -0.13394451],
       [-0.7300275 , -1.18120283,  0.40682874,  1.88765587],
       [-0.46677922,  0.62752763, -0.10108341, -0.39166712]])

In [124]: names = np.array(['Bob','Joe','Bob'])

In [125]: data[ names=='Bob' ]#布尔
Out[125]:
array([[-1.83015216, -0.23576058, -1.87630722, -0.57173307],
       [ 0.02156803,  1.01569783, -1.77392021, -0.58198894]])

In [126]: data[names!='Bob']#否法一
Out[126]: array([[-0.55301255, -0.33224718,  0.06431646,  0.02957661]])

In [127]: data[-(names == 'Bob')]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-127-1242c1c7d3ed> in <module>()
----> 1 data[-(names == 'Bob')]

TypeError: The numpy boolean negative, the `-` operator, is not supported, use the `~` operator or the logical_not function instead.

In [128]: data[~(names == 'Bob')]#否法二
Out[128]: array([[-0.55301255, -0.33224718,  0.06431646,  0.02957661]])

In [129]: mask = (names=='Bob')|(names =='Joe') #用&和| ,Python关键字and和or在布尔型数组中无效

In [130]: data[mask]
Out[130]:
array([[-1.83015216, -0.23576058, -1.87630722, -0.57173307],
       [-0.55301255, -0.33224718,  0.06431646,  0.02957661],
       [ 0.02156803,  1.01569783, -1.77392021, -0.58198894]])

In [133]: data[names != 'Bob']= 10

In [134]: data
Out[134]:
array([[-1.75188112, -0.97473529, -0.92438864, -0.13394451],
       [10.        , 10.        , 10.        , 10.        ],
       [-0.46677922,  0.62752763, -0.10108341, -0.39166712]])

花式索引:指的是利用整数数组进行索引
跟切片不一样,总是将数据复制到新数组中

In [135]: arr = np.empty((8,4))

In [136]: for x in range(8):
     ...:     arr[x] =x
     ...:

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

In [138]: arr[[4,3,5]]#选取按照自定义顺序排列,顺序用[]
Out[138]:
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [5., 5., 5., 5.]])

In [139]: arr = np.arange(32).reshape((8,4))
#向reshape传入一个表示新形状的元组即可达到‘无需复制任何数据,数组就能从一个形状转换为另一个形状’。
#其中一维可以为负值,会根据大小自动调整
#一维到多维---reshape()
#多维到一维---reval() flatten()

In[31]:np.shape(arr)#维度
Out[31]: (8, 4)

In [140]: arr
Out[140]:
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 [141]: arr[[1,2,3],[1,2,3]]#(1,2),(2,2,)(3,3)
Out[141]: array([ 5, 10, 15])

In [142]: arr[[1,2,3]][:,[1,2,3]]#前面选取三行作为一个新的数组,再筛选新的数组中的三列
Out[142]:
array([[ 5,  6,  7],
       [ 9, 10, 11],
       [13, 14, 15]])

In [143]: arr[np.ix_([1,2,3],[1,2,3])]
#np.ix()可以将两个一维整数数组转换为一个用于选取方形区域的索引器
Out[143]:
array([[ 5,  6,  7],
       [ 9, 10, 11],
       [13, 14, 15]])

转置
arr.T #视图
☆通用函数ufunc
一元ufunc
np.abs(x)
np.modf(x)#将数组的小数和整数部分以两个独立数组的形式返回
二元ufunc
np.add(x,y)
np.subtract(x,y)
np.maximum(x,y)
np.minimum(x,y)
np.mod(x,y)#求余
用数组表达式代替循环的做法,通常被称为矢量化
☆将条件逻辑表述为数组运算
np.where(condition,x,y)#x if condition else y
☆数学和统计方法
基本数组统计方法
arr.sum() #经常被用来对布尔型数组中的True值计数
arr.mean()
arr.min()
arr.max()
arr.cumsum()
arr.cumprod()

bools = np.array([False,True])    
bools.any()#是否至少一个为True
bools.all()#是否均为True

☆排序


In [205]: arr = np.random.randn(8)

In [206]: arr
Out[206]:
array([ 0.50564263, -1.8029587 ,  0.56072006, -0.9617723 ,  1.32689105,
        0.18775961, -2.01358541,  0.13219525])

In [207]: np.sort(arr)#顶级方法np.sort()返回副本
Out[207]:
array([-2.01358541, -1.8029587 , -0.9617723 ,  0.13219525,  0.18775961,
        0.50564263,  0.56072006,  1.32689105])

In [208]: arr
Out[208]:
array([ 0.50564263, -1.8029587 ,  0.56072006, -0.9617723 ,  1.32689105,
        0.18775961, -2.01358541,  0.13219525])

In [209]: arr.sort()#就地排序会修改数组本身

In [210]: arr
Out[210]:
array([-2.01358541, -1.8029587 , -0.9617723 ,  0.13219525,  0.18775961,
        0.50564263,  0.56072006,  1.32689105])

数组的集合运算
np.unique(arr)#计算arr中的唯一元素,并返回有序结果
np.intersect1d(arr1,arr2)#计算arr1&arr2的公共元素,并返回有序结果
np.union1d(arr1,arr2)#计算arr1&arr2的并集,并返回有序结果
np.in1d(x,y)#得到一个表示“x的元素是否包含于y”的布尔型数组
np.setdiff1d(x,y)#差,在x中且不在y中
np.setor1d(x,y)#集合的对称差,存在于一个数组中但不同时存在于两个数组中的元素
numpy.random模块
部分函数
np.random.seed()#种子
np.random.rand()
np.random.randn()#正态分布 In [219]: np.random.randn(3) Out[219]: array([ 0.43302619, 1.20303737, -0.96506567])
np.random.normal()#In [218]: np.random.normal(10) Out[218]: 9.825399789407058
☆数组的合并和拆分
np.concatenate([arr1,arr2],axis=1) ====np.hstack((arr1,arr2))#以面向列的方式对数组进行堆叠(沿轴1)
np.concatenate([arr1,arr2],axis=0) -====np.vstack((arr1,arr2))#以面向行的方式对数组进行堆叠(沿轴0)
np.split(arr,[x1,x2]) #x1,x2为切割位置
☆元素的重复操作
repeat#将数组中的各个元素重复一定次数

In [232]: arr = np.arange(3)

In [233]: arr
Out[233]: array([0, 1, 2])

In [234]: arr.repeat(3)
Out[234]: array([0, 0, 0, 1, 1, 1, 2, 2, 2])

In [235]: arr.repeat([1,2,3])
Out[235]: array([0, 1, 1, 2, 2, 2])

tile#沿指定轴向堆叠数组的副本

In [238]: np.tile(arr,2)
Out[238]: array([0, 1, 2, 0, 1, 2])

In [240]: np.tile(arr,(3,2))
Out[240]:
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])

☆广播
指的是不同形状的数组之间的算术运算的执行方式。

广播的原则
如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

增加新轴

arr_1d = np.random.normal(size=3)

np.shape(arr_1d)
Out[48]: (3,)

arr1 = arr_1d[:,np.newaxis]#:复制,np.newaxis新轴

np.shape(arr1)
Out[50]: (3, 1)

arr2 = arr_1d[np.newaxis,:]

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

推荐阅读更多精彩内容