飞道的博客

Numpy中常用函数

200人阅读  评论(0)

常用函数:

实验代码

import numpy as np

1、切片与索引

1.1维数组索引

1)创建一个数组a,对a进行反向切片操作

a=np.arange(10)  
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a[::-1] 
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

2) 间隔取值

a[::2]
array([0, 2, 4, 6, 8])

3) 取数组a前5个元素

a[:5]
array([0, 1, 2, 3, 4])

2.二维数组索引

二维数组中,各索引位置上的元素不再是标量,而是一维数组。

1) 创建一个二维数组arr1,索引第0行,即下标为0的元素

arr1 = np.array([[1,2,3],[4,5,6],[7,8,9]])  
arr1  
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
arr1[0]
array([1, 2, 3])

2) 索引第1行第2列即下标为[1,2]的元素。

arr1[1,2]
6

3.多维数组索引

多维数组里,单个索引值返回的是一个纬度低一点的数组。

1) 创建一个2维数组arr2。

arr2=np.arange(36).reshape(6,6)  
arr2 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

2) 取得arr2数组中第2行元素

arr2[1]
array([ 6,  7,  8,  9, 10, 11])

3) 取得arr2数组中第3列元素

arr2[:,3]
array([ 3,  9, 15, 21, 27, 33])

4) 取arr2数组中行下标为1到3,列下标为2到3的数组。

arr2[1:4,2:4]
array([[ 8,  9],
       [14, 15],
       [20, 21]])

5) 取arr2数组中行列下标步长为2的元素

arr2[::2,::2]
array([[ 0,  2,  4],
       [12, 14, 16],
       [24, 26, 28]])

4.利用整数数组进行索引

1) 新建两个数组a,i,使用数组i的值作为下标对数组a进行索引。

a=np.arange(12)**2  
i=np.array([1,1,3,8,5])  
a
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121],
      dtype=int32)
a[i]
array([ 1,  1,  9, 64, 25], dtype=int32)

5.当被索引数组a是多维的时,每一个唯一的索引数列指向a的对应行数。

palette = np.array( [ [0,0,0],[255,0,0],[0,255,0],[0,0,255],[255,255,255]] )  image = np.array( [ [ 0, 1, 2, 0 ],[ 0, 3, 4, 0 ]  ] )  palette
array([[  0,   0,   0],       [255,   0,   0],       [  0, 255,   0],       [  0,   0, 255],       [255, 255, 255]])
image
array([[0, 1, 2, 0],       [0, 3, 4, 0]])
palette[image]
array([[[  0,   0,   0],        [255,   0,   0],        [  0, 255,   0],        [  0,   0,   0]],       [[  0,   0,   0],        [  0,   0, 255],        [255, 255, 255],        [  0,   0,   0]]])

6.通过两个数组i,j作为下标对数组a进行索引,这时a[i,j]为数组i和数组j相同位置的对应数值两两组成一对索引,然后用这对索引在数组a中进行取值,必须保证数组i与数组j的维数相同。

a=np.arange(12).reshape(3,4)  a     
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
i=np.array([[0,1],[1,2]])    i
array([[0, 1],       [1, 2]])
j=np.array([[2,1],[3,3]])    j
array([[2, 1],       [3, 3]])
a[i,j]
array([[ 2,  5],       [ 7, 11]])

7.通过argmax方法索引数组中最大元素的索引,搜索下面sin值的最大索引,这里四舍五入后值的最大索引。

data=np.sin(np.arange(20)).reshape(5,4)  data  
array([[ 0.        ,  0.84147098,  0.90929743,  0.14112001],       [-0.7568025 , -0.95892427, -0.2794155 ,  0.6569866 ],       [ 0.98935825,  0.41211849, -0.54402111, -0.99999021],       [-0.53657292,  0.42016704,  0.99060736,  0.65028784],       [-0.28790332, -0.96139749, -0.75098725,  0.14987721]])
ind=data.argmax(axis=0)  ind
array([2, 0, 3, 1], dtype=int64)

8.np.sin()

numpy.sin(x, /, out=None, *, where=True, casting=‘same_kind’, order=‘K’, dtype=None, subok=True[, signature, extobj]) = <ufunc ‘sin’>

三角正弦,元素方式。

参数:
x: : array_like
角度,以弧度(2 \pirad等于360度)。

out: : ndarray, None, 或 tuple of ndarray and None, 可选参数
结果存储的位置。如果提供,它必须具有输入广播到的形状。如果未提供或没有,则返回一个新分配的数组。元组(只能作为关键字参数)的长度必须等于输出的数量。

where: : array_like, 可选参数
此条件通过输入广播。在条件为True的位置,将out数组设置为ufunc结果。在其他地方,out数组将保留其原始值。请注意,如果通过默认创建未初始化的输出数组out=None,条件中为False的位置将保持未初始化状态。

**kwargs:

返回值:
y: : 数组
x的每个元素的正弦。如果x是标量,则这是标量。

np.sin(np.pi/2.)
1.0

9.布尔值索引

布尔值索引指的是一个由布尔值组成的数组可以作为一个数组的索引,返回的数据为True值对应位置的值

1)通过布尔数组索引,创建加一个数组a,使用a>4得到的布尔型数组b对数组a进行索引,取满足b数组中为True条件时,数组a的值。

a=np.arange(12).reshape(3,4)  a
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
b=a>4  b
array([[False, False, False, False],       [False,  True,  True,  True],       [ True,  True,  True,  True]])
a[b]
array([ 5,  6,  7,  8,  9, 10, 11])

由上面的操作可以看出,数组切片是原始数组的视图,但是任何修改都会直接反映到原数组上:下面是对数组a本身进行修改,将满足b为True条件a的值改为0。

a[b]=0a
array([[0, 1, 2, 3],       [4, 0, 0, 0],       [0, 0, 0, 0]])

10.通过布尔来索引的方法更近似于整数索引;

1) 对数组的每个维度我们给一个一维布尔数组来选择我们想要的切片

a=np.arange(12).reshape(3,4)  a
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
b1=np.array([False,True,True])  b1
array([False,  True,  True])
b2=np.array([True,False,True,False])  b2
array([ True, False,  True, False])
a[b1,:]
array([[ 4,  5,  6,  7],       [ 8,  9, 10, 11]])

注意一维数组的长度必须和你想要切片的维度或轴的长度一致,在之前的例子中,b1是一个秩为1长度为三的数组(a的行数),b2(长度为4)与a的第二秩(列)相一致。

2、条件查询

1.创建a,b数组,使用take()函数,根据b中元素作为索引,查找a中元素的值。

a=np.arange(1,11)  a
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
b=np.array([1,4,6])  b 
array([1, 4, 6])
np.take(a,b) 
array([2, 5, 7])

2.创建数组x,使用np.argwhere函数,查找x大于1的元素,返回数组x的下标和元素个数。

x = np.arange(6).reshape(2,3)  x
array([[0, 1, 2],       [3, 4, 5]])
 np.argwhere(x>1)
array([[0, 2],       [1, 0],       [1, 1],       [1, 2]], dtype=int64)

3.使用np.extract函数,查找x大于2的元素,返回满足条件的数组元素。

np.extract([x>2],x) 
array([3, 4, 5])

4.使用np.where函数,查找x大于2的元素,返回满足条件的数组元素的索引值。

np.where(x>2) 
(array([1, 1, 1], dtype=int64), array([0, 1, 2], dtype=int64))

5.ix_ 函数可以合并不同的向量来获得多个元组的结果

1)如果你想要用所有向量a、b和c元素组成的三元组来计算 a+b*c

a=np.array([2,3,4,5])  b=np.array([8,5,4])  c=np.array([5,4,6,8,3])  ax,bx,cx=np.ix_(a,b,c)  ax
array([[[2]],       [[3]],       [[4]],       [[5]]])
bx
array([[[8],        [5],        [4]]])
cx
array([[[5, 4, 6, 8, 3]]])
 ax.shape,bx.shape,cx.shape
((4, 1, 1), (1, 3, 1), (1, 1, 5))
result=ax+bx*cxresult
array([[[42, 34, 50, 66, 26],        [27, 22, 32, 42, 17],        [22, 18, 26, 34, 14]],       [[43, 35, 51, 67, 27],        [28, 23, 33, 43, 18],        [23, 19, 27, 35, 15]],       [[44, 36, 52, 68, 28],        [29, 24, 34, 44, 19],        [24, 20, 28, 36, 16]],       [[45, 37, 53, 69, 29],        [30, 25, 35, 45, 20],        [25, 21, 29, 37, 17]]])
result[3,2,4]
17
a[3]+b[2]*c[4] 
17

3、数组组合

1.水平组合(np.hstack(),np.concatenate(axis=1))

1)创建一个数组a,再将a每个值乘以2构成数组b

a=np.array([[1,2,3],[4,5,6],[7,8,9]])  a
array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9]])
b = a*2b
array([[ 2,  4,  6],       [ 8, 10, 12],       [14, 16, 18]])

2) 使用np.hstack()函数对数组a,b进行水平组合.

np.hstack((a,b))  
array([[ 1,  2,  3,  2,  4,  6],       [ 4,  5,  6,  8, 10, 12],       [ 7,  8,  9, 14, 16, 18]])

3) 使用np.concatenate(axis=1)函数对数组a,b进行水平组合.

np.concatenate((a,b),axis=1)  
array([[ 1,  2,  3,  2,  4,  6],       [ 4,  5,  6,  8, 10, 12],       [ 7,  8,  9, 14, 16, 18]])

2.垂直组合(np.vstack(),np.concatenate(axis=0))

1) 使用np.vstack()函数对数组a,b进行垂直组合.

np.vstack((a,b))
array([[ 1,  2,  3],       [ 4,  5,  6],       [ 7,  8,  9],       [ 2,  4,  6],       [ 8, 10, 12],       [14, 16, 18]])

2) 使用np.concatenate(axis=0)函数对数组a,b进行垂直组合.

np.concatenate((a,b),axis=0)  
array([[ 1,  2,  3],       [ 4,  5,  6],       [ 7,  8,  9],       [ 2,  4,  6],       [ 8, 10, 12],       [14, 16, 18]])

3.深度组合:沿着纵轴方向组合(np.dstack())

1)使用np.dstack()函数对数组a,b进行深度组合。

np.dstack((a,b))
array([[[ 1,  2],        [ 2,  4],        [ 3,  6]],       [[ 4,  8],        [ 5, 10],        [ 6, 12]],       [[ 7, 14],        [ 8, 16],        [ 9, 18]]])

4.列组合column_stack():一维数组:按列方向组合,二维数组:同hstack一样

1)使用column_stack()函数对数组a,b进行列组合.

np.column_stack((a,b))
array([[ 1,  2,  3,  2,  4,  6],       [ 4,  5,  6,  8, 10, 12],       [ 7,  8,  9, 14, 16, 18]])

5.行组合row_stack():一维数组:按行方向组合,二维数组:和vstack一样

1)使用row_stack()函数对数组a,b进行行组合.

np.row_stack((a,b))  
array([[ 1,  2,  3],       [ 4,  5,  6],       [ 7,  8,  9],       [ 2,  4,  6],       [ 8, 10, 12],       [14, 16, 18]])

4、数组分割

1.创建一个数组a,再将a每个值乘以2构成数组b,

a=np.array([[1,2,3],[4,5,6],[7,8,9]])  a
array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9]])
b=a*2  b
array([[ 2,  4,  6],       [ 8, 10, 12],       [14, 16, 18]])

2.水平分割

1) 使用hsplit()函数,以3对数组a进行水平分割.

np.hsplit(a,3)
[array([[1],        [4],        [7]]), array([[2],        [5],        [8]]), array([[3],        [6],        [9]])]

2) 调用split函数并指定参数axis=1,以3对数组a进行垂直分割

np.split(a,3,axis=1)
[array([[1],        [4],        [7]]), array([[2],        [5],        [8]]), array([[3],        [6],        [9]])]

3.垂直分割

1)使用vsplit()函数,以3对数组a进行垂直分割。

np.vsplit(a,3)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

2)调用split函数并指定参数axis=0,以3对数组a进行垂直分割

np.split(a,3,axis=0)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

4.使用tolist()函数将数组,转变成列表。

1)创建一个数组a,将数组a使用tolist函数转变成列表。

a=np.array([1,2,3])  a
array([1, 2, 3])
a.tolist()
[1, 2, 3]

5、通用函数

1.创建一维数组x,使用np.sin函数对x中所有元素求正弦值

x=np.arange(0,100,10,dtype=np.float64)  a = np.sin(x)  a
array([ 0.        , -0.54402111,  0.91294525, -0.98803162,  0.74511316,       -0.26237485, -0.30481062,  0.77389068, -0.99388865,  0.89399666])

2.创建二维数组b,使用np.cos函数对b数组中所有元素求余弦值

b=np.arange(1,10).reshape(3,3)  b
array([[1, 2, 3],       [4, 5, 6],       [7, 8, 9]])
np.cos(b)
array([[ 0.54030231, -0.41614684, -0.9899925 ],       [-0.65364362,  0.28366219,  0.96017029],       [ 0.75390225, -0.14550003, -0.91113026]])

3.使用np.round函数,对上面余弦结果数组元素进行四舍五入

np.round(_)  
array([[ 1., -0., -1.],       [-1.,  0.,  1.],       [ 1., -0., -1.]])

4.使用numpy中的random.rand函数创建包含10个随机数的数组

x=np.random.rand(10)*10  x
array([2.2612299 , 7.20131365, 2.3055456 , 5.76279063, 4.11797351,       9.352511  , 7.26407455, 8.99025374, 0.01119493, 2.62834008])

5.使用np.floor函数对所有元素向下取整

np.floor(x)  
array([2., 7., 2., 5., 4., 9., 7., 8., 0., 2.])

6.使用np.ceil函数对所有元素向上取整。

np.ceil(x)  
array([ 3.,  8.,  3.,  6.,  5., 10.,  8.,  9.,  1.,  3.])

7.使用np.absolute函数对-3取绝对值运算

np.absolute(-3)
3

8.使用np.absolute函数,对3+4j模运算

np.absolute(3+4j)
5.0

9.使用isnan函数,判断是否为空

np.isnan(np.NAN)
True

10.使用np.log2函数对8进行对数运算

np.log2(8)
3.0

11.使用np.sqrt函数对range(10)进行平方根运算

np.sqrt(range(10))  
array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,       2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ])

12.创建一个数组a,使用np.mean函数求数组a的均值

a=np.array([1,2,6,3,4,5,8])  np.mean(a)
4.142857142857143

13.使用np.average()函数,求range(1,5)的加权weights=range(4,0,-1)的平均值。

np.average(range(1,5),weights=range(4,0,-1))  
2.0

14.创建一个数组a,使用np.var()函数,求数组a的方差值

a=np.array([1,2,6,3,4,5,8])  np.var(a) 
4.979591836734693

15.创建一个数组a,使用np.std()函数,求数组a的标准差值

a=np.array([1,2,6,3,4,5,8])  np.std(a) 
2.231499907401901

16.点积,创建两个数组a,b,计算两个数组的线性组合,一维上是对应元素相乘,多维可将a*b视为矩阵乘法

a=np.array((1,2,3))  a
array([1, 2, 3])
b=np.array((4,2,1))  b
array([4, 2, 1])
a.dot(b) #向量内积  
11
np.dot(a,b)
11

17.创建一个二维数组c,c数组的每行与a数组计算内积。

c = np.array(([1,2,3],[4,5,6],[7,8,9]))  c.dot(a)  
array([14, 32, 50])

18.a数组与c数组的每列计算内积。

a.dot(c)  
array([30, 36, 42])

转载:https://blog.csdn.net/m0_46202060/article/details/117093042
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场