数组很重要,因为它使你不用编写循环即可对数据执行批量运算。这通常叫做矢量化。
大小相等的数组之间的任何算术运算都会将运算应用到元素级:
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