为什么要用numpy,numpy和原生python的比较:
numpy创建数组
np.array创建数组
- object是必选参数,可以是列表,元组,甚至可以是ndarray类型数组。例:numpy.array([1,2,3])或numpy.array(arr1)
- dtype是可选参数,用于强制转换数组元素的类型,例:np.array([1,2,3.0,4.0,5.5],dtype = 'int')
- copy用于复制一个数组,默认为True。True时复制的的数组与原数组id不同,False时复制的数组与原数组的id相同。也可以直接使用=,是试图操作,相当于列表的引用赋值操作。
- subok,例:
a = np.mat([1,2,3,4,5])#创建一个矩阵,矩阵类型 #复制a的一个副本,又不想改变其数据类型 b = np.array(a,subok = True)
np.arange生成区间数组
-
当参数为两个时,默认这两个参数时start和stop,而不是stop和step。
-
arange和range的不同之处。range(4.1)会报错,因为默认步长时整数,而开始结束值为浮点数。arange(4.1)不会报错,且返回值均为浮点型
-
改变返回的ndarray的元素的数据类型
np.linspace()创建等差数列
np.logspace()生成等比数列
np.zeros()生成全零数组
-
元素类型默认为float浮点数类型,默认是float64
-
数组的形状不是一维时用元组表示,例:np.zeros((4,4),dtype='int')#4*4的数组
-
zeros_like()返回与给定数组相同形状的零数组,例:arr1 = np.zeros_like([[1,2,3],[1,2,3]])
np.ones()生成全一数组
同理,还有全一数组
numpy数组的属性
ndarray.shape
- 用来获取矩阵的形状,返回的是一个元组。
- 可以使用ndarray.reshape((n,m))改变数组的形状。返回调整维度后的副本,而不改变原来的数组。
- 若使用reshape()方法改变数组的形状,改变后的数组元素个数和原来数组的元素个数不同就会报错。此时可以使用ndarray.resize()来改变维度
- 使用numpy.resize(a,newshape)函数改变数组的维度时,若新数组的元素比原数组的元素多,则元素组的元素会在多出的部分再写一轮,写满为止。这个和arr.resize(newshape,refcheck =False)方法的不同之处在于arr.resize()会用零补充。
ndarray.ndim
- 返回数组的维度(秩):轴的数量,或者说时维度的数量,是一个标量
ndarray.size
- 数组元素的个数,相当于shape中n*m的值
ndarray.dtype
astype()方法,返回数据类型改变后的数据,但原数组的数据类型不会发生改变。例:
import numpy as np
a = np.zeros((3,3))
b = a.astype('int')
print(a.dtype,b.dtype)
ndarray的切片和索引
一维数组的切片和索引
另外,还有[:n],表示从第一个索引开始到第n个索引结束。不包括索引n
二维数组的切片和索引
arr[start:stop:step]
对于二维数组,arr[n]取的是arr第n行的一维数组,而一维数组arr[n]在加一个[m就是取得该一维数组的第m个元素,即]arr[n][m]取得是第n行m列的元素,等价于arr[n,m]。切片arr[a:b]会切出来arr的a行到b行的二维数组。可以进行二维切片,如:arr[a:b,x:y],可以切出来a行到b行,x列到y列的二维数组。
整数数组的索引
x[[0,1,2],[0,1,0]]索引的第一个列表[0,1,2]表示索引行的0,1,2行,后一个列表[0,1,0]是用来索引列0,1,0的。表示取数组x[0,0],x[1,1],x[2,0]元素。这样索引必须保证同时索引的行和列数量相同。
布尔数组的索引
例:找出数组中为奇数的元素,并将这些元素修改为-1
import numpy as np
arr1 = np.arange(30).reshape(5, 6)
print(arr1[arr1 % 2==1]) #输出结果[ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29]
arr1[arr1 % 2==1] = -1
print(arr1)
也可以使用&和|来表示多个条件
还可以使用True和False的形式来表示自己需要和不需要的数据
例:
Row1 = np.array([True, False, False, True, True]) # 表示需要第1、4、5行
Column1 = np.array([True, False, False, True, True, False]) # 表示需要第1、4、5列
arr2 = arr1[Row1]
arr3 = arr1[:, Column1]
arr4 = arr1[Row1, Column1]
print(arr1, '\n\n', arr2, '\n\n', arr3, '\n\n', arr4)
若两个一维数组的True数量不匹配,就会报错。这一点和整形索引一样
数组的索引和切片的值的更改会影响原数据!!!!!