numpy常用函数笔记

来源:互联网 发布:目标 知乎 编辑:程序博客网 时间:2024/06/05 06:58

The Basics

import numpy as np
  • arange 类似range 构造一个长度为15的数组
a=np.arange(15);a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
  • reshape 将array中的元素重新排列,构成一个 m*n的矩阵
a=a.reshape(3,5);a
array([[ 0,  1,  2,  3,  4],       [ 5,  6,  7,  8,  9],       [10, 11, 12, 13, 14]])
  • ndim 维度 shape 形状 size 矩阵中元素个数 dtype 数据类型 itemsize 元素大小
(a.ndim,a.shape,a.size,a.dtype,a.itemsize)
(2, (3, 5), 15, dtype('int64'), 8)
a=np.array([2,3,4]);a
array([2, 3, 4])
np.zeros((3,4)) # 构造一个3*4的全0矩阵
array([[ 0.,  0.,  0.,  0.],       [ 0.,  0.,  0.,  0.],       [ 0.,  0.,  0.,  0.]])
np.ones((3,4)) # 构造一个3*4的全1矩阵
array([[ 1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.],       [ 1.,  1.,  1.,  1.]])
np.empty((3,4)) # 构造一个空矩阵 , 元素值随机
array([[ 0.,  0.,  0.,  0.],       [ 0.,  0.,  0.,  0.],       [ 0.,  0.,  0.,  0.]])
np.arange(10,30,5) # 通过步长构造
array([10, 15, 20, 25])
np.linspace(0,2,9) # 构造浮点数 0到2 直接的9个数
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
A = np.array( [[1,1],[0,1]] );B = np.array( [[2,0],[3,4]] )
A*B  # 矩阵中对应元素相乘
array([[2, 0],       [0, 4]])
A.dot(B) # 数学意义上的矩阵乘法
array([[5, 4],       [3, 4]])
a=np.random.random((2,3)) # 随机数
a.sum(),a.min(),a.max()
(1.6231236054863918, 0.015016836871937334, 0.9391410245273063)
b=np.arange(12).reshape((3,4));b
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11]])
b.sum(axis=0)  # 求第一列的和
array([12, 15, 18, 21])

索引切片和迭代

a=np.arange(10)**3;a
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
a[2:5] # 与python切片一样
array([ 8, 27, 64])
a[::-1] # 反转
array([729, 512, 343, 216, 125,  64,  27,   8,   1,   0])
b=np.arange(20).reshape(5,4);b
array([[ 0,  1,  2,  3],       [ 4,  5,  6,  7],       [ 8,  9, 10, 11],       [12, 13, 14, 15],       [16, 17, 18, 19]])
b[2,3]
11
b[0:5,1] # 每一行的第二列 
array([ 1,  5,  9, 13, 17])
b[:,1] #所有行的第二列
array([ 1,  5,  9, 13, 17])
b[1:3,:] # 第二行和第三行的所有列
array([[ 4,  5,  6,  7],       [ 8,  9, 10, 11]])

形状

a = np.floor(10*np.random.random((3,4)))
a.shape
(3, 4)
a.ravel()  # returns the array, flattened
array([ 5.,  4.,  8.,  9.,  1.,  5.,  0.,  4.,  5.,  6.,  7.,  5.])
a.reshape(6,2)
array([[ 5.,  4.],       [ 8.,  9.],       [ 1.,  5.],       [ 0.,  4.],       [ 5.,  6.],       [ 7.,  5.]])
a.T
array([[ 5.,  1.,  5.],       [ 4.,  5.,  6.],       [ 8.,  0.,  7.],       [ 9.,  4.,  5.]])
a.T.shape
(4, 3)

数组合并

a = np.floor(10*np.random.random((2,2)));a
array([[ 5.,  0.],       [ 8.,  7.]])
b = np.floor(10*np.random.random((2,2)));b
array([[ 3.,  8.],       [ 0.,  9.]])
np.vstack((a,b))
array([[ 5.,  0.],       [ 8.,  7.],       [ 3.,  8.],       [ 0.,  9.]])
np.hstack((a,b))
array([[ 5.,  0.,  3.,  8.],       [ 8.,  7.,  0.,  9.]])

数组切分

a = np.floor(10*np.random.random((2,12)));a
array([[ 8.,  0.,  3.,  3.,  0.,  1.,  3.,  8.,  3.,  5.,  6.,  6.],       [ 6.,  7.,  1.,  3.,  3.,  6.,  0.,  8.,  1.,  3.,  9.,  3.]])
np.hsplit(a,3)
[array([[ 8.,  0.,  3.,  3.],        [ 6.,  7.,  1.,  3.]]), array([[ 0.,  1.,  3.,  8.],        [ 3.,  6.,  0.,  8.]]), array([[ 3.,  5.,  6.,  6.],        [ 1.,  3.,  9.,  3.]])]

索引技巧

  • 通过其他数组索引
a = np.arange(12)**2;a
array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100, 121])
i=np.array( [ 1,1,3,8,5 ]);i
array([1, 1, 3, 8, 5])
a[i]
array([ 1,  1,  9, 64, 25])
j = np.array( [ [ 3, 4], [ 9, 7 ] ] );j #这是一个新矩阵,元素是在a总的位置
array([[3, 4],       [9, 7]])
a[j]
array([[ 9, 16],       [81, 49]])
  • 通过布尔值索引
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]], dtype=bool)
a[b]
array([ 5,  6,  7,  8,  9, 10, 11])
a[b]=0;a
array([[0, 1, 2, 3],       [4, 0, 0, 0],       [0, 0, 0, 0]])

随机数

import numpy.random as random
random.rand(2,2) # 生成0到1的随机数
array([[ 0.22720579,  0.34879209],       [ 0.44804558,  0.60633532]])
random.randn(2,2) # 标准正态分布
array([[-0.52681005,  0.94763894],       [-0.0359733 , -0.49147302]])
random.randint(2,6,(3,3))  # 整形
array([[4, 4, 5],       [5, 4, 3],       [2, 3, 2]])
random.random_sample((3,3))
array([[ 0.85905432,  0.65012434,  0.89731924],       [ 0.28359538,  0.11117507,  0.68106958],       [ 0.14467215,  0.62230059,  0.60000001]])
random.random_sample(3) 
array([ 0.71007475,  0.93676534,  0.56104804])
random.random(3) 
array([ 0.6353798 ,  0.90959019,  0.13963355])
random.choice(5, 3) # 从5个里面随机选三个 如果a是一个整数 则生成arange数组里面选
array([4, 1, 3])
random.choice(5, 3, p=[0.1, 0, 0.3, 0.6, 0]) # p控制每个元素被选择的概率
array([3, 2, 3])
arr = np.arange(10)  #洗牌random.shuffle(arr)arr
array([6, 8, 7, 1, 2, 9, 4, 0, 5, 3])
random.permutation(10) #随机排列
array([9, 2, 1, 6, 5, 3, 7, 4, 0, 8])

排序,搜索,计数

data=random.permutation(10);data
array([0, 7, 6, 4, 1, 8, 5, 3, 9, 2])
data=data.reshape(2,5);data
array([[0, 7, 6, 4, 1],       [8, 5, 3, 9, 2]])
np.sort(data)
array([[0, 5, 3, 4, 1],       [8, 7, 6, 9, 2]])
np.argmax(data,axis=1) # 取不同轴的最大值所在的位置
array([1, 3])
0 0