目录
创建数组
ndarray对象的属性
索引和切片
Numpy数组算术
数组的转置和换轴
通用函数
除了使用mat方法创建matrix对象和array方法创建array对象,下面例举下其他方法创建数组。
np.zeros(shape, dtype = float, order = 'C')创建指定大小的数组,数组元素以 0 来填充。
np.empty(shape, dtype = float, order = 'C')用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,数组的值是随机的。
np.ones(shape, dtype = None, order = 'C')创建指定形状的数组,数组元素以 1 来填充。
np.full(shape, fill_value, dtype=None, order='C')该方法用于生成大小为shape,全file_value的矩阵。
np.eye(N, M=None, k=0, dtype=float, order='C')该方法用于生成大小为M*N的单位矩阵。参数N是行数,M是列数,默认M=N,k表示对角线1的偏移量。
In [1]: np.eye(3,3) Out[1]: array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) In [2]: np.eye(3,3,k=1) Out[2]: array([[0., 1., 0.], [0., 0., 1.], [0., 0., 0.]])np.asarray(a, dtype = None, order = None)
这个方法与np.array()方法一样,只是参数个数不同而已,常用于讲matrix对象转换为array对象。
np..fromiter(iterable, dtype, count=-1)从可迭代对象中建立 ndarray 对象,返回一维数组。
np.arange(start = 0, stop, step = 1, dtype)start默认是0,step默认是1。返回指定范围和步长的ndarray对象。
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)该方法用于创建一个一维数组,数组是一个等差数列构成的。参数num是数组元素的个数,默认50;参数endpoint决定是否包含stop值;参数retstep决定是否显示间距。该方法的间距会尽可能的大。
In [1]: np.linspace(1,5,2,retstep=True) Out[1]: (array([1., 5.]), 4.0) In [2]: np.linspace(1,5,2,retstep=True,endpoint=False) Out[2]: (array([1., 3.]), 2.0)np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
该方法用于创建一个于等比数列,参数base是对log的底数;参数start表示序列的起始值为:base ** start;参数stop表示序列的终止值为:base ** stop。
In [1]: np.logspace(0,9,10,base=2) Out[1]: array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])我们可以直接修改shape属性来改变数组的shape,与 reshape 函数效果一样。
数组的切片是原数组的视图,对于切片对象的修改,会反映到原数组上。如果你只是想单纯显式复制一份数组,推荐使用array.copy()方法。
import numpy as np arr = np.array([1,2,3,4,5]) arr1 = arr[3:] #array([4, 5]) arr1[:] = 0 arr #array([1, 2, 3, 0, 0]) arr2 = arr.copy() #array([1, 2, 3, 4, 5]) arr2[:] = 0 #array([0, 0, 0, 0, 0]) arr #array([1, 2, 3, 4, 5]) 基础索引ndarray 数组可以基于 0 - n 的下标进行索引,返回的是具体元素的值。
In [1]: a Out[1]: matrix([[1, 2], [2, 3]]) In [2]: a[0,0] Out[2]: 1 整数数组索引通过指定行索引和列索引来同时取出多个元素。返回的维度大小取决于行索引(列索引)的维度大小,如下所示,行索引是一维的[0,1,2],则返回的结果也是一维的[1,4,2],返回的是a[0,1]、a[1,1]、a[2,2]这三个数组成的数组。
In [1]: a = np.array(((1,2,3),(1,4,5),(5,4,2))) In [2]: a Out[2]: array([[1, 2, 3], [1, 4, 5], [5, 4, 2]]) In [3]: a[[0,1,2],[0,1,2]] Out[3]: array([1, 4, 2])下面示例的行索引维度为二,所以返回的是二维。
In [1]: a = np.array(((1,2,3,5),(1,4,6,5),(5,4,3,2))) In [2]: a[[[0,1],[0,1]],[[2,3],[1,1]]] Out[2]: array([[3, 5], [2, 4]])你还可以只指定行索引,而忽略列索引,这样将对指定行的所有列元素取出来。
In [1]: a = np.array(((1,2,3,5),(1,4,6,5),(5,4,3,2))) In [2]: a[[0,1]] Out[2]: array([[1, 2, 3, 5], [1, 4, 6, 5]]) 布尔索引布尔索引是通过将数组的下标用条件表达式来替代,返回条件为Ture的元素,故返回的结果是一维的。注意这里条件的取反使用~。Python关键字and和or对布尔数组并没有用,应使用&或|。
In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[a >4] Out[2]: array([5, 6, 5, 5]) In [3]: a[~(a >4)] Out[3]: array([1, 2, 3, 1, 4, 4, 3, 2]) 切片数值的切片和列表的切片是一样的,唯一的区别就是数值可以是多维的,而对每个维度的限定是以逗号隔开。
In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[0:1] Out[2]: array([[1, 2, 3, 5]]) In [3]: a[0,2:] Out[3]: array([3, 5])对于第一个维度行,如果不想对其做切片,不能省略,可以用...或:来占位,如下所示:
In [1]: a Out[1]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [2]: a[...,] Out[2]: array([[1, 2, 3, 5], [1, 4, 6, 5], [5, 4, 3, 2]]) In [3]: a[:,2] Out[3]: array([3, 6, 3]) In [4]: a[,5] File "<ipython-input-88-d0e440202029>", line 1 a[,5] ^ SyntaxError: invalid syntax对于第二个维度列,如果你想省略,可以直接不填。
数组之所以重要是因为它允许你进行批量操作而无需任何for循环。Numpy用户称这种特性叫向量化。
1. 任何两个同尺寸的数组之间的算数方式都应用了元素对应操作的方式。
import numpy as np arr = np.array([1,2,3,4]) arr*arr #array([ 1, 4, 9, 16]) arr -arr #array([0, 0, 0, 0])2. 带有标量计算的算术操作,会把计算参数传递给数组的每一个元素。
arr*2 #array([2, 4, 6, 8])3. 同尺寸的数组之间比较,会产生一个布尔值数组。
arr = np.array([1,2,3,4]) arr1 = np.array([2,2,3,3]) arr == arr1 #array([False, True, True, False])数组的转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容。数组拥有transponse方法和特殊的T属性进行转置。
import numpy as np arr = np.arange(15).reshape((3,5)) /* array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) */ arr.T 或 arr.transpose() /* array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]]) */对于高于二维的数组,transponse方法可以接收包含轴编号的元组,用于置换轴,可支持多个轴交换。
ndarray有一个swapaxes方法,该方法接收一对轴编号作为参数,并对轴进行调整用于重组数据,只支持两个轴交换。
import numpy as np arr = np.arange(16).reshape((2,2,4)) /* array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) */ arr.transpose((1,0,2)) 或者 arr.swapaxes(1,0) /* array([[[ 0, 1, 2, 3], [ 8, 9, 10, 11]], [[ 4, 5, 6, 7], [12, 13, 14, 15]]]) */通用函数,也可以称为ufunc,是一种在ndarray数据中进行逐元素操作的函数。通用函数可分为一元通用函数和二元通用函数。
import numpy as np arr = np.arange(8).reshape((2,4)) /* array([[0, 1, 2, 3], [4, 5, 6, 7]]) */ np.sqrt(arr) /* array([[0. , 1. , 1.41421356, 1.73205081], [2. , 2.23606798, 2.44948974, 2.64575131]]) */ x = np.random.randn(8) array([-0.93131489, -0.49453729, -0.57471257, 0.27222773, 3.09210037, 1.30070564, -0.689972 , 1.7015398 ]) y = np.random.randn(8) array([-1.14355521, -1.07714762, -0.86314268, 0.04644867, -0.57504133, -0.56352821, 0.72239222, 0.89803925]) np.maximum(x,y) array([-0.93131489, -0.49453729, -0.57471257, 0.27222773, 3.09210037, 1.30070564, 0.72239222, 1.7015398 ])numpy.where函数是三元表达式的向量化版本。该函数有三个参数,第一个是一个bool值数组,后面两个可以是标量或向量。当为True,选择第二个参数的值,否则选择第三个参数的值。
import numpy as np arr = np.random.randn(3,3) array([[-0.69943268, 0.59761547, -0.33936636], [ 0.2146388 , 0.16762762, 0.20330484], [ 0.83699423, 0.44246455, -0.20510247]]) np.where(arr<0,0,arr) #将数组小于0的数置为0 array([[0. , 0.59761547, 0. ], [0.2146388 , 0.16762762, 0.20330484], [0.83699423, 0.44246455, 0. ]]) 数学和统计方法像mean、sum、cumsum等函数可以接收一个可选参数axis,用于计算给定轴向上的统计值。如sum(axis = 1)表示在列的方向上,对每行求和。
布尔值数组的方法布尔值在数值计算上会被强制为1(True)和0(False),如下面的sum方法。
import numpy as np arr = np.array([True,False,True,False]) arr.sum() #2对于布尔值数组,有两个非常有用的方法any和all,any检查数组中是否至少有一个True,而all检查是否每个值都是True。这个方法也适用于非布尔值数组,因为所有非0元素都会按True处理。
import numpy as np arr = np.array([True,False,True,False]) arr.any() #True arr.all() #False 排序Numpy数组可以使用sort方法进行排序。
import numpy as np arr = np.random.randn(5) #array([ 0.6887544 , 1.89534564, -0.50606733, 1.38259784, -0.81475966]) arr.sort() #array([-0.81475966, -0.50606733, 0.6887544 , 1.38259784, 1.89534564]) arr1 = np.random.randn(3,3) array([[-1.92777094, 1.07420293, -1.51616526], [-0.0293244 , 2.71201676, -0.06842536], [ 1.04100276, -0.88579533, -0.06523198]]) arr1.sort(1) array([[-1.92777094, -1.51616526, 1.07420293], [-0.06842536, -0.0293244 , 2.71201676], [-0.88579533, -0.06523198, 1.04100276]]) 唯一值与其他集合逻辑1.np.unique()
返回数组中唯一值排序后形成的数组。
import numpy as np arr = np.array([2,2,4,5,8,3,4]) np.unique(arr) #array([2, 3, 4, 5, 8])2. np.in1d()
检查一个数组中的值是否在另一个数组中,并返回布尔值数组。
import numpy as np arr = np.array([2,2,4,5,8,3,4]) arr1 = np.array([1,2,3]) np.in1d(arr,arr1) #array([ True, True, False, False, False, True, False])