python numpy array索引_python数据分析(三) python numpy--数组--运算,切片和索引

Numpy数组的运算:

numpy数组最大的特点是任何运算,都会自动的对数组当中的所有变量进行运算,所以千万不要试图自己去使用循环去取数组当中的值进行运算(非常愚蠢)。

1.相同大小的数组之间的运算

数组可以不编写循环而对数据执行批量运算,称之为矢量化,大小相同数组之间的算术运算将会应用到元素级。

In [51]: arr = np.array([[1., 2., 3.], [4., 5., 6.]])

In [52]: arr

Out[52]:

array([[1.,2.,3.],

[4.,5.,6.]])

In [53]: arr *arr

Out[53]:

array([[1.,4.,9.],

[16.,25.,36.]])

In [54]: arr -arr

Out[54]:

array([[ 0.,0.,0.],

[ 0.,0.,0.]])

2.大小不同的数组之间的运算

大小不同的数组之间的运算叫做广播,本教程暂时不涉及该内容。

3.标量与数组之间的运算

数组与标量值之间的运算,会将标量值传播到各个元素

In [55]: 1 /arr

Out[55]:

array([[1.,0.5,0.3333],

[0.25,0.2,0.1667]])

In [56]: arr ** 0.5Out[56]:

array([[1.,1.4142,1.7321],

[2.,2.2361,2.4495]])

Numpy数组的索引和切片

keypoint:

1.Numpy的切片非常重要的一点是,numpy的切片是原数组的视图,而不是副本,这也就意味着对于切片的赋值和修改会直接反映到原数组当中,这样设计的目的是由于,由于numpy处理的都是大数据,如果需要复制的话会对内存造成多大的压力。

2.Numpy多维数组当中最常见的是二维数组,我们日常工作当中也主要是对二维数组进行操作,Numpy当中的轴是数组很重要的概念。0代表纵轴也就是行伸展的方向,numpy当中默认axis=0,也是基于日常数据处理通常是逐行进行数据处理,1代表横轴,是列的伸展,需要对列进行操作时,通常需要指定axis=1。

一维数组

一维数组的索引和切片与python当中的列表差不多

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

In [61]: arr

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

In [62]: arr[5]

Out[62]: 5In [63]: arr[5:8]

Out[63]: array([5, 6, 7])

In [64]: arr[5:8] = 12In [65]: arr

Out[65]: array([ 0,1,2,3,4, 12, 12, 12,8,9])

多维数组

以二维数组为例

索引

单行索引

当你想要获取二维数组的某一行(注意是仅是单行)可以使用arr[],同时假如需要该行当中的某一列时可以采用arr[2][3]或者arr[2,3] 这两者是等价的

In [10]: data

Out[10]:

array([[1.0788974 , 0.68102429, 1.25657144, 0.86003818],

[0.12736723, -1.02105407, -1.73882805, -0.95977831],

[1.72637531, 1.34888078, -0.30239276, -0.2500709],

[1.35099747, -1.548361 , 0.42033975, -0.45966589],

[-1.33488847, 0.03941755, 1.62740521, 1.06397523],

[0.24654034, -1.78687642, -1.48406199, 0.26911715],

[-1.51003484, -0.00391514, 1.0792482 , 1.4810209]])

In [15]: data[0]

Out[15]: array([1.0788974 , 0.68102429, 1.25657144, 0.86003818])

In [16]: data[0,2,4,6]---------------------------------------------------------------------------IndexError Traceback (most recent call last) in

----> 1 data[0,2,4,6]

IndexError: too many indicesfor array

In [17]: data[0][2]

Out[17]: 1.25657144416686In [18]: data[0,2]

Out[18]: 1.25657144416686

多行索引

当你需要数组其中的多行时,需要使用[[]]来指定需要的行

In [14]: data[[0,2,4,6]]

Out[14]:

array([[1.0788974 , 0.68102429, 1.25657144, 0.86003818],

[1.72637531, 1.34888078, -0.30239276, -0.2500709],

[-1.33488847, 0.03941755, 1.62740521, 1.06397523],

[-1.51003484, -0.00391514, 1.0792482 , 1.4810209 ]])

同时很是特殊的一点是,当你想要其中的一些行与列时,你可能想到这样使用:arr[[1, 5, 7, 2], [0, 3, 1, 2]],但是你会发现得到是一个一维数组

In [22]: arr

Out[22]:

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 [23]: arr[[1, 5, 7, 2], [0, 3, 1, 2]]

Out[23]: array([ 4, 23, 29, 10])

当你想得到的这样的结果时,以下是其中一种方法:

In [24]: arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]

Out[24]:

array([[4, 7, 5, 6],

[20, 23, 21, 22],

[28, 31, 29, 30],

[8, 11, 9, 10]])

布尔型索引

假设我们有一个存储数据的数组以及一个存储姓名的数组(含有重复项)。

In [39]: names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will',

...:'Joe', 'Joe'])

In [40]: names=='Bob'Out[40]: array([ True, False, False, True, False, False, False])

In [41]:

In [41]: data

Out[41]:

array([[-0.47939978, -0.27428342, -0.02822451, -0.62677857],

[-0.18555679, 0.99210039, 0.87669318, -1.57915413],

[0.17315275, -0.29671656, 0.03367578, -0.48463786],

[0.77769241, 0.96771955, -0.97982095, 0.63315926],

[1.14798883, -1.48005509, 0.89713203, 0.603149],

[-0.18193742, -0.36894573, -0.84374283, -0.02646659],

[0.27853348, -0.52659678, -0.23512094, -0.39094411]])

假设每个名字都对应data数组当中的一行,而我们想要选出对应于名字“Bob”的所有行。跟算术运算一样,数组的比较也是矢量化的。

In [44]: data[names=='Bob']

Out[44]:

array([[-0.47939978, -0.27428342, -0.02822451, -0.62677857],

[0.77769241, 0.96771955, -0.97982095, 0.63315926]])

除此以外当你想找到名字不是Bob的,可以使用~符号取反

In [45]: data[~(names=='Bob')]

Out[45]:

array([[-0.18555679, 0.99210039, 0.87669318, -1.57915413],

[0.17315275, -0.29671656, 0.03367578, -0.48463786],

[1.14798883, -1.48005509, 0.89713203, 0.603149],

[-0.18193742, -0.36894573, -0.84374283, -0.02646659],

[0.27853348, -0.52659678, -0.23512094, -0.39094411]])

In [46]:

注意当你想要组合多个布尔条件时,python当中内置的and 和or是不行的需要使用 | 和&这些布尔运算符

In [47]: data[(names=='Bob')|(names=='Will')]

Out[47]:

array([[-0.47939978, -0.27428342, -0.02822451, -0.62677857],

[0.17315275, -0.29671656, 0.03367578, -0.48463786],

[0.77769241, 0.96771955, -0.97982095, 0.63315926],

[1.14798883, -1.48005509, 0.89713203, 0.603149 ]])

通过布尔型索引设置值

In [48]: data[data<0]=0

In [49]: data

Out[49]:

array([[0. , 0. , 0. , 0. ],

[0. ,0.99210039, 0.87669318, 0. ],

[0.17315275, 0. , 0.03367578, 0. ],

[0.77769241, 0.96771955, 0. , 0.63315926],

[1.14798883, 0. , 0.89713203, 0.603149],

[0. , 0. , 0. , 0. ],

[0.27853348, 0. , 0. , 0. ]])

切片

切片的语法,切片仅接受一种语法data[0:5,2:4]不接受data[0:5][2:4],正如前面提到,切片也是首先在0轴上切片,然后是1轴

In [49]: data

Out[49]:

array([[0. , 0. , 0. , 0. ],

[0. ,0.99210039, 0.87669318, 0. ],

[0.17315275, 0. , 0.03367578, 0. ],

[0.77769241, 0.96771955, 0. , 0.63315926],

[1.14798883, 0. , 0.89713203, 0.603149],

[0. , 0. , 0. , 0. ],

[0.27853348, 0. , 0. , 0. ]])

In [50]: data[0:5][2:4]

Out[50]:

array([[0.17315275, 0. , 0.03367578, 0. ],

[0.77769241, 0.96771955, 0. , 0.63315926]])

In [51]:

In [51]: data[0:5,2:4]

Out[51]:

array([[0. , 0. ],

[0.87669318, 0. ],

[0.03367578, 0. ],

[0. ,0.63315926],

[0.89713203, 0.603149 ]])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值