- 创建一个ndarray数组
- numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- object:数组或嵌套的数列,dtype:数组元素的数据类型,ndmin:指定生成数组的最小维度
- numpy.asarray(a, dtype = None, order = None)
- numpy.asarray 类似 numpy.array,但 numpy.asarray参数只有三个,比numpy.array少两个。
- numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
数据类型
-
numpy.dtype(object, align, copy) object - 要转换为的数据类型对象 align - 如果为 true,填充字段使其类似 C 的结构体。 copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
-
举例说明
dt = np.dtype([('name', 'S10'),('age', int)]) a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt)
-
内建类型的唯一字符代码:
-
-
修改已经定义好的数组数据类型:a = b.astype(int16)
数组属性
-
常见属性
-
b = a.reshape(3,2),重新定义数组长宽
-
axis=0,表示沿着第0轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。
创建数组
- numpy.empty(shape, dtype = float, order = ‘C’)
- 创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组(数组里什么数都有可能)
- order有"C"和"F"两个选项,分别代表,行优先和列优先
- numpy.zeros(shape, dtype = float, order = ‘C’)
- 创建指定大小的数组,数组元素以 0 来填充
- numpy.ones(shape, dtype = None, order = ‘C’)
- 创建指定大小的数组,数组元素以 0 来填充
数值范围创建数组
- numpy.arange(start, stop, step, dtype)
- 根据start与stop指定的范围以及step设定的步长,生成一个ndarray
切片和索引
- b = a[2:7:2] #从索引2开始到索引7停止,间隔为2
- 切片还可以包括省略号…,使选择元组的长度与数组的维度相同
- a = np.array([[1,2,3],[3,4,5],[4,5,6]])
- print (a[…,1]) # 第2列元素 -> [2 4 5]
- print (a[1,…]) # 第2行元素 -> [3 4 5]
高级索引
- x = np.array([[1,2], [3,4], [5,6]]) y = x[[0,1,2], [0,1,0]] -> [1 4 5]
- a = np.array([[1,2,3], [4,5,6],[7,8,9]]) b = a[1:3, 1:3] -> [[5 6] [8 9]]
- x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]]) x[x>5] -> [6 7 8 9 10 11]
广播
-
广播是numpy对不同形状的数组进行数值计算的方式
-
形状相同:
a = np.array([1,2,3,4]) b = np.array([10,20,30,40]) c = a * b 输出:[10 40 90 160]
-
形状不同:
a = np.array([[0,0,0],[10,10,10]]) b = np.array([1,2,3]) a+b 输出:[[1 2 3] [11 12 13]]
迭代数组
- 使用nditer函数
- 基本使用方法
- a = np.arange(6).reshape(2,3) for x in np.nditer(a):print (x, end=", " ) -> 0, 1, 2, 3, 4, 5,
- 顺带修改元素值
- for x in np.nditer(a, op_flags=[‘readwrite’]): x[…]=2*x -> [[0 2 4] [6 8 10]]
- flags参数:用到的时候再查
- 基本使用方法
数组操作
修改数组形状
-
- b = a.reshape(4,2)
- b = a.flatten(),将数组降成一维的
翻转数组
-
- np.transpose(a)会将数组维度对调,[[1 2 3] [4 5 6]] -> [[1 4] [2 5] [3 6]]
连接数组
-
-
numpy.concatenate((a1, a2, …), axis),a1, a2, …:相同类型的数组,axis:沿着它连接数组的轴,默认为 0
-
numpy.stack(arrays, axis) 注意他是沿着新的轴增加,会导致输出维度高一维
a = np.array([[1,2],[3,4]]) b = np.array([[5,6],[7,8]]) np.stack((a,b),axis = 0) 输出是 [[[1 2] [3 4]] [[5 6] [7 8]]]
-
numpy.hstack和numpy.vstack只是水平堆叠,不会导致维度变化
print (np.hstack((a,b))) 输出是 [[1 2 5 6] [3 4 7 8]]
-
分割数组
-
- numpy.split(ary, indices, axis) ary:被分割的数组,indices:整数,就用该数平均切分,数组,为沿轴切分的位置(左开右闭),axis:沿着哪个维度进行切向,默认为0,横向切分。1,纵向切分
- numpy.hsplit 函数用于水平分割数组,np.hsplit(harr, 3)把harr分成三等分
- numpy.vsplit 函数用于竖直分割数组,np.vsplit(harr, 3)把harr分成三等分
数组元素添加与删除
](https://imgchr.com/i/ahc8qf)
- numpy.resize(arr, shape) shape:返回数组的新形状,新数组大于原始大小,则包含原始数组中的元素的副本,reshape是不能大于原始大小的
- numpy.append(arr, values, axis=None) 当axis为 None,返回总是为一维数组 arr:输入数组 values:要向arr添加的值,需要和arr形状相同(除了要添加的轴) axis:当axis有定义的时候,分别为0和1的时候。当axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
- numpy.insert(arr, obj, values, axis) arr:输入数组 obj:在其之前插入值的索引 values:要插入的值 axis:沿着它插入的轴,如果未提供,则输入数组会被展开
- Numpy.delete(arr, obj, axis) arr:输入数组 obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组 axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开
- numpy.unique 函数用于去除数组中的重复元素。
位运算
](https://imgchr.com/i/ahWQk8)
字符串函数
-
-
调用:np.char.upper()
数学函数
- 三角函数:np.sin,np.cos,np.tan和arcsin等等
- numpy.around(a,decimals) 函数返回指定数字的四舍五入值,a: 数组,decimals: 舍入的小数位数,默认值为0
- numpy.floor() 返回小于或者等于指定表达式的最大整数,即向下取整。
- numpy.ceil() 返回大于或者等于指定表达式的最小整数,即向上取整。
算术函数
计算的数组必须具有相同的形状或符合数组广播规则。
- 加减乘除:add(),subtract(),multiply(),divide()
- numpy.reciprocal() 函数返回参数逐元素的倒数。
- numpy.power() 函数将计算相应元素的幂。
- numpy.mod() 计算输入数组中相应元素的相除后的余数
统计函数
- numpy.amin(a, axis) 用于计算数组中的元素沿指定轴的最小值。
- numpy.amax(a, axis) 用于计算数组中的元素沿指定轴的最大值。
- numpy.ptp(a, axis)函数计算数组中元素最大值与最小值的差,不指定轴就是整个数组最大-最小
- numpy.median(a, axis) 函数用于计算数组 a 中元素的中值,不指定轴就是整个数组中值
- numpy.mean(a, axis) 函数返回数组中元素的算术平均值。 如果提供了轴,则沿其计算。
- numpy.average(a, weights = b ,axis) 函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。该函数可以接受一个轴参数。 如果没有指定轴,则数组会被展开。如数组[1,2,3,4]和相应的权重[4,3,2,1],加权平均值 = (1 * 4+2*3+3 * 2+4 * 1)/(4+3+2+1)
- np.std(a)函数是计算标准差的,标准差公式:std = sqrt(mean((x - x.mean())**2))
- np.var([1,2,3,4])函数是计算方差的,方差公式:mean((x - x.mean())** 2)
- numpy.percentile(a, q, axis) a: 输入数组 q: 要计算的百分位数,在 0 ~ 100 之间 axis: 沿着它计算百分位数的轴
排序、条件刷选函数
- numpy.sort(a, axis, kind, order) 函数返回输入数组的排序副本 a: 要排序的数组 axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序, axis=0 按列排序,axis=1 按行排序 kind: 默认为’quicksort’(快速排序) order: 如果数组包含字段,则是要排序的字段
- numpy.argsort(a) 函数返回的是数组值从小到大的索引值。
- numpy.lexsort() 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。
- numpy.argmax(a,axis) 和 numpy.argmin(a,axis)函数分别沿给定轴返回最大和最小元素的索引。
- numpy.nonzero(a) 函数返回输入数组中非零元素的索引。
- numpy.where(condition) 函数返回输入数组中满足给定条件的元素的索引。 np.where(x > 3)
- numpy.extract(condition, a) 函数根据某个条件从数组中抽取元素,返回满条件的元素。
condition = np.mod(x,2)== 0 np.extract(condition, x)
字节交换
- numpy.ndarray.byteswap() 函数将 ndarray 中每个元素中的字节进行大小端转换。
副本和视图
介绍
- 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
- 视图一般发生在:
- numpy 的切片操作返回原数据的视图。
- 调用 ndarray 的 view() 函数产生一个视图。
- 副本一般发生在:
- Python 序列的切片操作,调用deepCopy()函数。
- 调用 ndarray 的 copy() 函数产生一个副本。
拷贝
-
无复制:a=b,一个数组的形状改变也会改变另一个数组的形状。
-
视图或浅拷贝:ndarray.view()会创建一个新的数组对象,a.shape = (3,2),该方法创建的新数组的维数更改不会更改原始数据的维数。但是修改数据会影响到原始数组
-
ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
-
插一嘴题外话
>>>alist = [] >>> num = [2] >>> alist.append( num ) >>> id( num ) == id( alist[0] ) True 当 list 类型的对象进行 append 操作时,实际上追加的是该对象的引用。num 发生变化时(前提是 id(num) 不发生变化),alist 的内容随之会发生变化。 想避免这种情况,可以采用深拷贝解决: alist.append(copy.deepcopy(num))
矩阵库
- 转置矩阵:行变列,列变行。a.T就是转置矩阵
- numpy.matlib.empty(shape, dtype, order) shape: 定义新矩阵形状的整数或整数元组 Dtype: 可选,数据类型 order: C(行序优先)或者 F(列序优先)
- numpy.matlib.zeros((2,2)) 函数创建一个以 0 填充的矩阵。
- numpy.matlib.ones((2,2))函数创建一个以 1 填充的矩阵。
- numpy.matlib.eye(n,M,k,dtype) 函数返回一个矩阵,对角线元素为 1,其他位置为零。n: 返回矩阵的行数
M: 返回矩阵的列数,默认为 n ,k: 对角线的索引 ,dtype: 数据类型 - numpy.matlib.identity(5,dtype=int) 函数返回给定大小的单位矩阵。
- numpy.matlib.rand((3,3)) 函数创建一个给定大小的矩阵,数据是随机填充的。
线性代数
-
- numpy.dot(a, b, out=None) 函数是两个向量的内积
- numpy.vdot() 函数是两个向量的点积。如果参数是多维数组,它会被展开。
- numpy.inner() 函数返回一维数组的向量内积。对于更高的维度,它返回最后一个轴上的和的乘积。
- numpy.matmul 函数返回两个数组的矩阵乘积。
- numpy.linalg.det() 函数计算输入矩阵的行列式。
- numpy.linalg.solve() 函数给出了矩阵形式的线性方程的解。
- numpy.linalg.inv() 函数计算矩阵的乘法逆矩阵。