一.一维数组
1.(1)arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维
数组,注意得到的结果数组不包含终值。例如下面的程序创建开始值为0、终值为1、步长为
0.1 的等差数组,注意终值1 不在数组中:

np.arange(开始值,终值,步长)

(2)linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过
endpoint 参数指定是否包含终值,默认值为True,即包含终值

linspace(开始值,终值,元素个数)

a = np.arange(1,5,1)
b = np.linspace(1,5,5)

a
Out[18]: array([1, 2, 3, 4])

b
Out[19]: array([1., 2., 3., 4., 5.])

(3)logspace()所创建的数组是等比数列;基数可以通过base 参数指定,默认值为10。
下面通过将base 参数设置为2,并设置endpoint参数为False,创建一个比例为21/12 等比数列

np.logspace(0, 1, 12, base=2, endpoint=False)

(4)zeros()、ones()、empty()可以创建指定形状和类型的数组。其中:
empty()仅仅分配数组所使用的内存,不对数组元素进行初始化操作,因此它的运行速度是最快的
zeros()则将数组元素初始化为0,ones()将数组元素初始化为1

zeros_like()、ones_like()、empty_like()等函数可创建与参数数组的形状及类型相同的数组。
因此,“zeros_like(a)”和“zeros(a.shape, a.dtype)”的效果相同。
np.random.rand(10) # 产生一个长度为10、元素值为0 到1 的随机数组
fromfunction()的第一个参数为计算每个数组元素的函数,第二个参数指定数组的形状。因
为它支持多维数组,所以第二个参数必须是一个序列。

2.一维数组的元素存取
(1)使用和列表相同的存取方式
a[5] # 用整数作为下标可以获取数组中的某个元素;
a[3:5] # 用切片作为下标可以获取数组的一部分,包括a[3]但不包括a[5];
–和列表不同的是,通过切片获取的新数组是原始数组的一个视图。它与原始数组共享同一块数据存储空间
(2)整数列表:使用列表作为下标得到的数组不和原始数组共享数据
x=np.arange(10,1,-1)
b=x[[2,3,3]] #b=array([8,8,7])
b[2]=2 #x[3]=7≠b[2]=2
x[[1,4]]=-1,-2 #整数列表也可以修改原数组的值

(3)整数数组:当使用整数数组作为数组下标时,将得到一个形状和下标数组相同的新数组
当下标数组是一维时,结果和用列表作为下标的结果相同:
x=np.arange(1,4,1)
b=x[np.array([1,2,1])] #b=array([2,3,2])
当下标是多维数组时,则得到的也是多维数组:
先将下标数组展平为一维数组,并作为下标获得一个新的一维数组,然后再将其形状修改为下标数组的形状
x=np.arange(10,1,1)
b=x[np.array([1,2],[2,3,3])] #b=array([9,8],[8,7,7])
(4)布尔数组:布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True 的元素
使用布尔数组作为下标获得的数组不和原始数组共享数据内存,注意这种方式只对应于布尔数组,不能使用布尔列表;
如果是布尔列表,则把True 当作1, False 当作0,按照整数序列方式获取数组x 中的元素;
布尔数组的长度不够时,不够的部分都当作False;
布尔数组一般不是手工产生,而是使用布尔运算的ufunc 函数产生

二.ufunc函数
1.math 库和NumPy 中的数学函数,各有利弊
对单个数值的计算math.sin要比np.sin 快很多;
对于单个数值的计算,math.sin 返回的是Python的标准float 类型,而np.sin 返回的是float64 类型

2.通过下标获取的数组元素的类型为NumPy 中定义的类型。将其转换为Python 的标准类型还需要花费额外的时间。
为了解决这个问题,数组提供了item()方法,用来获取数组中的单个元素,并直接返回标准的Python 数值类型

  1. 算数运算
    add()返回一个数组,数组的每个元素都是两个参数数组中对应元素之和。如果没有指定out 参数,
    那么将创建一个新的数组来保存计算结果。如果指定了第三个参数out,就不产生新的数组,而是直接将结果保存到指定的数组中。
    两个数组相加可以简单地写为a+b,而np.add(a,b,a)则可以用a+=b 表示
    运 算 符 对应的ufunc 函数
    y = x1 + x2 add(x1, x2 [, y])
    y = x1 - x2 subtract(x1, x2 [, y])
    y = x1 * x2 multiply (x1, x2 [, y])
    y = x1 / x2 divide (x1, x2 [, y]), 如果两个数组的元素为整数,那么用整数除法
    y = x1 / x2 true_divide (x1, x2 [, y]), 总是返回精确的商
    y = x1 // x2 floor_divide (x1, x2 [, y]), 总是对返回值取整
    y = -x negative(x [,y])
    y = x1**x2 power(x1, x2 [, y])
    y = x1 % x2 remainder(x1, x2 [, y]),或mod(x1, x2, [, y])

4.比较运算
使用“==”、“>”等比较运算符对两个数组进行比较,将返回一个布尔数组,它的每个元素值都是两个数组对应元素的比较结果

比较运算符			ufunc 函数
y = x1 == x2		equal(x1, x2 [, y])
y = x1 != x2		not_equal(x1, x2 [, y])
y = x1 < x2		less(x1, x2, [, y])
y = x1 <= x2		less_equal(x1, x2, [, y])
y = x1 > x2		greater(x1, x2, [, y])
y = x1 >= x2		greater_equal(x1, x2, [, y])

5.逻辑(布尔)运算
由于Python 中的布尔运算使用and、or 和not 等关键字,它们无法被重载,因此数组的布尔运算只能通过相应的ufunc 函数进行。
这些函数名都以“logical_”开头,np.logical_and, np.logical_not, np.logical_or, np.logical_xor

6.位运算符
比特运算函数,包括bitwise_and、bitwise_not、bitwise_or 和bitwise_xor 等。
也可以使用"&"、"~"、"|“和”^"等操作符进行计算

7.frompyfunc函数
通过frompyfunc()可以将计算单个值的函数转换为一个能对数组中每个元素进行计算的ufunc 函数:frompyfunc(func, nin, nout)
func 是计算单个元素的函数,nin 是func 输入参数的个数,nout 是func 返回值的个数

使用vectorize()可以实现和frompyfunc()类似的功能,但它可以通过otypes 参数指定返回数组的元素类型。
otypes 参数可以是一个表示元素类型的字符串,也可以是一个类型列表,使用列表可以描述多个返回数组的元素类型