数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常叫做矢量化。
大小相等的数组之间的任何算术运算都会将运算应用到元素级:
In [38]: arr=np.array([[1.,2.,3.],[4.,5.,6.]])
In [39]: arr
Out[39]:
array([[1., 2., 3.],
[4., 5., 6.]])
In [40]: arr*arr
Out[40]:
array([[ 1., 4., 9.],
[16., 25., 36.]])
In [41]: arr-arr
Out[41]:
array([[0., 0., 0.],
[0., 0., 0.]])
同样,数组与标量的算术运算也会将那个标量值传播到各个元素:
In [44]: 1/arr
Out[44]:
array([[1. , 0.5 , 0.33333333],
[0.25 , 0.2 , 0.16666667]])
In [45]: arr**0.5
Out[45]:
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])
不同大小的数组之间的运算叫做广播
基本的索引和切片
Numpy数组的索引使一个内容丰富的主题,因为选区数据子集或单个元素的方式有很多种
In [7]: arr
Out[7]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
In [8]: arr_slice=arr[5:8]
In [9]: arr_slice
Out[9]: array([12, 12, 12])
In [10]: arr_slice[1]=12345
In [11]: arr_slice
Out[11]: array([ 12, 12345, 12])
In [12]: arr
Out[12]:
array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8,
9])
Numpy涉及的目的是处理大数据,不专注数据复制,如果想得到ndarray切片的一份副本而非试图,就需要显式地进行复制操作,例如arr[5:8].copy()
对于高维度数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不再是标量而是一维数组
切片索引
ndarry的切片语法跟python列表这样的一维对象差不多:
切片式沿着一个轴向选取元素的,像这样进行切片的时候,只能得到相同维数的数组试图。
In [47]: arr2d[:2,1:]
Out[47]:
array([[2, 3],
[5, 6]])
In [56]: data=np.random.randn(7,4)
In [57]: data
Out[57]:
array([[-0.47913266, -0.30477197, 0.66404979, -0.9187831 ],
[ 1.47680489, -1.29158289, 0.34761902, 0.12130798],
[ 0.56144005, 1.36820597, -2.00164737, -0.2554913 ],
[-0.56632529, 0.84605031, 1.00731573, -1.67826478],
[-0.26310489, -0.32148272, -1.57393012, -0.6656574 ],
[ 1.2186885 , 0.98964553, -0.75777939, 0.59467277],
[ 0.18207753, 0.21029665, -1.74577673, 0.95509791]])
布尔型索引
In [58]: names
Out[58]: array([‘Bob‘, ‘Joe‘, ‘Will‘, ‘Bob‘, ‘Will‘, ‘Joe‘, ‘Joe‘], dtype=‘<U4‘)
In [59]: names==‘Bob‘
Out[59]: array([ True, False, False, True, False, False, False])
In [60]: data[names==‘Bob‘]
Out[60]:
array([[-0.47913266, -0.30477197, 0.66404979, -0.9187831 ],
[-0.56632529, 0.84605031, 1.00731573, -1.67826478]])
选区三个名字中的两个需要组合应用多个布尔条件,使用&(和)、|(或)之类的布尔算术运算符即可:
In [79]: mask=(names==‘Bob‘)|(names==‘Will‘)
In [80]: mask
Out[80]: array([ True, False, True, True, True, False, False])
In [81]: data[mask]
Out[81]:
array([[-0.47913266, -0.30477197, 0.66404979, -0.9187831 ],
[ 0.56144005, 1.36820597, -2.00164737, -0.2554913 ],
[-0.56632529, 0.84605031, 1.00731573, -1.67826478],
[-0.26310489, -0.32148272, -1.57393012, -0.6656574 ]])
通过布尔型数组设置值是一种经常用到的手段
In [83]: data[data<0]=0
In [84]: data
Out[84]:
array([[0. , 0. , 0.66404979, 0. ],
[1.47680489, 0. , 0.34761902, 0.12130798],
[0.56144005, 1.36820597, 0. , 0. ],
[0. , 0.84605031, 1.00731573, 0. ],
[0. , 0. , 0. , 0. ],
[1.2186885 , 0.98964553, 0. , 0.59467277],
[0.18207753, 0.21029665, 0. , 0.95509791]])
原文:https://www.cnblogs.com/chefli/p/11110085.html