欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

numpy学习记录

程序员文章站 2022-05-23 08:21:58
背 景 断断续续看了一些不错的 numpy 学习资料,发现他们大都是对官网学习文档的摘抄。放空心态,啃官网文档,做个快乐的小学生。 摘 要 NumPy 模块主要提供: 一个可包含任意同...

背 景

断断续续看了一些不错的 numpy 学习资料,发现他们大都是对官网学习文档的摘抄。放空心态,啃官网文档,做个快乐的小学生。

摘 要

NumPy 模块主要提供:

一个可包含任意同质元素【arbitrary homogeneous items】的数组对象【array object】 基于 数组 的 各种高性能数学操作

线性代数、傅里叶变换、随机数生成器

这个数组对象的主要属性:
ndarray.ndim、ndarray.shape、ndarray.size、ndarray.dtype、ndarray.itemsize及ndarray.data,具体含义直接看案例:

>>> a = np.arange(15).reshape(3,5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])      
>>> type(a)
numpy.ndarray
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int32'
>>> a.itemsize #元素占用空间大小
4
>>> a.size
15
>>> a = np.array(['tst',[1,2],10.29])
异常:ValueError: setting an array element with a sequence
(体验一下 数组元素的 'homogeneous' 性)
>>> a.data

创 建

import numpy as np
>>> a = np.array([[2,3,4],[3,5,7]])
array([[2, 3, 4],
       [3, 5, 7]])      
>>> b = np.array([[1,2],[3,4]],dtype=complex) #创建时指定元素类型
array([[ 1.+0.j,  2.+0.j],
       [ 3.+0.j,  4.+0.j]])       
>>> c = np.zeros((3,4)) #元素类型默认为 float
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])       
>>> d = np.arange(10,30,5)# 步长为 5
array([10, 15, 20, 25])
>>> e = np.linspace(0,2,9) # 0~2之间生成 9 个元素
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])
>>> f = np.sin(e)
array([ 0.        ,  0.24740396,  0.47942554,  0.68163876,  0.84147098,
        0.94898462,  0.99749499,  0.98398595,  0.90929743])

基本操作

array的操作都是基于 元素粒度的。

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> a-b # 相减
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> a<35
array([ True,  True, False, False], dtype=bool)
>>> a.dot(b) # 相乘
260
>>> c = np.ones((2,3),dtype=int)
array([[1, 1, 1],
       [1, 1, 1]])
>>> d = np.random.random((2,3)) 
array([[ 0.2405914 ,  0.92889199,  0.53239625],
       [ 0.95156094,  0.03129976,  0.19768109]])
>>> d+=c # 相加
>>> d
array([[ 1.2405914 ,  1.92889199,  1.53239625],
       [ 1.95156094,  1.03129976,  1.19768109]])
>>>e = np.random.random((2,3))
>>> np.sqrt(e) # 开方
array([[ 0.62054761,  0.51564375,  0.78904659],
       [ 0.56813652,  0.67124161,  0.91439529]])
>>> a = np.arange(20).reshape(4,5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

>>> np.apply_along_axis(func1d=np.sum,axis=1,arr=a) # 对 a 进行行级别求和
array([10, 35, 60, 85])

检索与遍历

单维度检索

单维度检索与python中的列表操作类似

>>> = np.arange(10)**3
array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729], dtype=int32)
>>> a[2]
8
>>> a[2:5]
array([ 8, 27, 64], dtype=int32)

>>> def f(x,y):
    return 10*x+y
>>> b = np.fromfunction(f,(5,4),dtype=int)
>>> b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>> b[2,3]
23
>>> b[0:5,1]
array([ 1, 11, 21, 31, 41])
>>> b[:,1]
array([ 1, 11, 21, 31, 41])
>>> b[1:3,:]
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])
>>> b[-1]
array([40, 41, 42, 43])

>>> for row in b: # 行级别的遍历;元素级别的遍历用 b.flat;
    print(row,':')

[0 1 2 3] :
[10 11 12 13] :
[20 21 22 23] :
[30 31 32 33] :
[40 41 42 43] :    

多维度检索

这个功能真心强大,特别是 boolean 数组类型的检索。

>>> a = np.arange(12)**2
>>> i = np.array([1,1,3,8,5])
>>> print(i,a)
[1 1 3 8 5] [  0   1   4   9  16  25  36  49  64  81 100 121]
>>> a[i] # 获取某几个元素
array([ 1,  1,  9, 64, 25])
>>> a = np.arange(12).reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> i = np.array([[0,1],[1,2]])
>>> j = np.array([[2,1],[3,3]])
>>> a[i,j] # 第一个元素 :第 0 行 2列,第二个元素:第 1 行 1 列
array([[ 2,  5],
       [ 7, 11]])
>>> a = np.arange(20).reshape(4,5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> a[:,[1,2]] #获取矩阵的某几行与几列
array([[ 1,  2],
       [ 6,  7],
       [11, 12],
       [16, 17]])
>>> a[[0,2],:]
array([[ 0,  1,  2,  3,  4],
       [10, 11, 12, 13, 14]])
a[np.ix_([0,2],[2,3])] # 使用 np.ix_ 获取第0行、2行与第2、3列交叉的元素。
array([[ 2,  3],
       [12, 13]])

通过boolean数组检索

>>> a = np.arange(12).reshape(3,4)
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]])
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])
b2 = np.array([True,False,True,False])
a[b1,:] 
array([[ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a[:,b2]
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10]])

变 型

自变

>>> a = np.floor(10*np.random.random((3,4)))
>>> a
array([[ 1.,  5.,  0.,  8.],
       [ 5.,  1.,  4.,  8.],
       [ 2.,  9.,  3.,  6.]])
>>> a.ravel()
array([ 1.,  5.,  0.,  8.,  5.,  1.,  4.,  8.,  2.,  9.,  3.,  6.])
>>> a.reshape(6,2)
array([[ 1.,  5.],
       [ 0.,  8.],
       [ 5.,  1.],
       [ 4.,  8.],
       [ 2.,  9.],
       [ 3.,  6.]])
>>> a.T
array([[ 1.,  5.,  2.],
       [ 5.,  1.,  9.],
       [ 0.,  4.,  3.],
       [ 8.,  8.,  6.]])
>>> a.resize((2,6))
array([[ 1.,  5.,  0.,  8.,  5.,  1.],
       [ 4.,  8.,  2.,  9.,  3.,  6.]])

协变

两个 array 通过 np.vstack,np.hstack 等方式,组合成新的 array 。

>>> a = np.floor(10*np.random.random((2,2)))
array([[ 5.,  3.],
       [ 0.,  4.]])
>>> b = np.floor(10*np.random.random((2,2)))
array([[ 2.,  5.],
       [ 7.,  3.]])
>>> np.vstack((a,b))
array([[ 5.,  3.],
       [ 0.,  4.],
       [ 2.,  5.],
       [ 7.,  3.]])
>>> np.column_stack((a,b))
array([[ 5.,  3.,  2.,  5.],
       [ 0.,  4.,  7.,  3.]])

数组切分

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

复 制

a = np.arange(12)
b = a #no copy
c = a.view() #shallow copy
d = a.copy() #deep copy

常用的几个分布

>>> np.random.seed(123) # 让结果可再现
>>> r1 = np.random.binomial(n=10,p=0.2,size=10) # 二项分布
array([3, 1, 1, 2, 3, 2, 5, 3, 2, 2])
>>> r2 = np.random.binomial(n=10,p=0.2,size=(2,3))
array([[1, 3, 2],
       [0, 2, 3]])
>>> r3 = np.random.normal(loc=2,scale=3,size=(3,5))#均值2标准差为3的正态分布
array([[ 0.66805412,  0.69694617,  8.61779025,  8.56035827,  5.01216169],
       [ 3.1585592 ,  4.21210573,  6.47219608, -0.80750161,  5.52748713],
       [-1.761642  ,  0.08674549,  4.72131559, -2.2860421 ,  1.57979384]])