美文网首页我爱编程
Python之numpy教程(二):运算、索引、切片

Python之numpy教程(二):运算、索引、切片

作者: Traeyee | 来源:发表于2017-04-22 15:40 被阅读0次

1.numpy数组的特点在于,大小相等的数组之间,任何算数运算都会将运算应用到元素级
请看下面的例子:

[python] view plain copy

10.布尔型索引

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
names

输出:

array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
生产一组随机数组

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

import numpy.random
data = numpy.random.randn(7,4)
data

输出:

array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [ 1.10877471, 0.04496048, 0.99851866, -0.65930485], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-0.30217902, 1.20441035, -0.88069583, -0.31243213], [-1.47970158, 0.08452533, -1.56347609, 1.88383865], [ 0.45802479, 0.84710767, -1.87281658, 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, -0.06899717]])
判断,产生一个布尔型数组
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

names == 'Bob'

输出:

array([ True, False, False, True, False, False, False], dtype=bool)

这个布尔型数组可以用于数组索引[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[names == 'Bob']

输出:array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [-0.30217902, 1.20441035, -0.88069583, -0.31243213]])
可以将布尔型数组跟切片、整数混合使用
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[names == 'Bob',2:]

输出:

array([[ 1.17834132, -0.21712539], [-0.88069583, -0.31243213]])
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[names == 'Bob',3]

输出:

array([-0.21712539, -0.31243213])
也可以用不等号(!=)进行或者符号(-)对条件进行否定索引

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

names != 'Bob'

输出:

array([False, True, True, False, True, True, True], dtype=bool)
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[-(names == 'Bob')]

输出:

array([[ 1.10877471, 0.04496048, 0.99851866, -0.65930485], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-1.47970158, 0.08452533, -1.56347609, 1.88383865], [ 0.45802479, 0.84710767, -1.87281658, 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, -0.06899717]])
11.也可以使用多个布尔型条件进行索引,这在实际操作中十分常见

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

mask = (names == 'Bob')|(names == 'Will')
mask

输出:

array([ True, False, True, True, True, False, False], dtype=bool)
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[mask]

输出:

array([[ 0.98990731, -0.26694924, 1.17834132, -0.21712539], [ 0.20479382, -0.09918733, -0.51451222, 1.43864803], [-0.30217902, 1.20441035, -0.88069583, -0.31243213], [-1.47970158, 0.08452533, -1.56347609, 1.88383865]])
把小于0的数都变为0

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[data < 0] = 0
data

输出:

array([[ 0.98990731, 0. , 1.17834132, 0. ], [ 1.10877471, 0.04496048, 0.99851866, 0. ], [ 0.20479382, 0. , 0. , 1.43864803], [ 0. , 1.20441035, 0. , 0. ], [ 0. , 0.08452533, 0. , 1.88383865], [ 0.45802479, 0.84710767, 0. , 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, 0. ]])
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

data[names != 'Joe'] = 7
data

输出:

array([[ 7. , 7. , 7. , 7. ], [ 1.10877471, 0.04496048, 0.99851866, 0. ], [ 7. , 7. , 7. , 7. ], [ 7. , 7. , 7. , 7. ], [ 7. , 7. , 7. , 7. ], [ 0.45802479, 0.84710767, 0. , 0.90212452], [ 0.57361001, 0.61528872, 1.25977742, 0. ]])
11.花式索引:
花式索引(Fancy indexing)是一个Numpy术语,它指的是利用整数数组进行索引
先建立一个8×4的empty数组

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

arr = np.empty((8,4))
arr

输出:

array([[ 2.27764263e-321, 0.00000000e+000, 3.65717707e-316, 0.00000000e+000], [ 0.00000000e+000, 2.50223420e-315, 0.00000000e+000, 4.42980404e-316], [ 0.00000000e+000, 3.61995693e-316, 2.50223420e-315, 4.43565180e-316], [ 2.50097935e-315, 4.59507256e-316, 0.00000000e+000, 0.00000000e+000], [ 0.00000000e+000, 0.00000000e+000, 4.42208160e-316, 0.00000000e+000], [ 3.65629171e-316, 1.98465379e-317, 2.50224669e-315, 2.63675246e-316], [ 0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 0.00000000e+000], [ 2.50224384e-315, 0.00000000e+000, 0.00000000e+000, 4.59490260e-316]])
给其赋值

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

for i in range(8):
arr[i] = i
arr

输出:

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.]])
特定的顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray:

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

arr[[4,3,0,6]]

输出:

array([[ 4., 4., 4., 4.], [ 3., 3., 3., 3.], [ 0., 0., 0., 0.], [ 6., 6., 6., 6.]])

使用负数索引会从末尾开始:

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

arr[[-3,-5,-7]]

输出:

array([[ 5., 5., 5., 5.], [ 3., 3., 3., 3.], [ 1., 1., 1., 1.]])
使用reshape函数改变行列数

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

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

输出:

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]])
[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

arr[[1,5,7,2],[0,3,1,2]]

输出:

array([ 4, 23, 29, 10])
可以看出,最终选出的元素是(1,0)、(5,3)、(7,1)、(2,2)

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

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

输出:

array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
另外一个办法是使用np.ix_函数,它可以将两个一维整数数组转换为一个用于选取方形区域的索引器

[python] view plain copy

在CODE上查看代码片在CODE上查看代码片 派生到我的代码片派生到我的代码片

arr[np.ix_([1,5,7,2],[0,3,1,2])]

输出:

array([[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]])
注意:花式索引跟切片不一样,它总是将数据复制到新数组中

相关文章

网友评论

    本文标题:Python之numpy教程(二):运算、索引、切片

    本文链接:https://www.haomeiwen.com/subject/ybjszttx.html