numpy基础操作

numpy基础操作

  numpy是python科学计算的基础库,主要提供了高性能的N维数组实现以及计算能力,实现了一些基础算法,较为复杂的科学计算要用到Scipy库,numpy库是该库的基础。

数组

数组的创建

普通的数组创建方法np.array(list)

@requires_authorization
import numpy as np;
a = np.array([1, 2, 3, 4])        
>>> array([1, 2, 3, 4])
b = np.array([[1,2],[3,4],[5,6]])
>>> array([[1, 2],
           [3, 4],
           [5, 6]])
np.arange(0, 51, 10)
>>> array([ 0, 10, 20, 30, 40, 50])

使用numpy提供的函数进行数组的创建
np.arange(int) np.linspace(start, end, num) np.ones((r, c)) np.eye(int) np.random.randn(r, c) np.random.randint(start, end, (r, c)) np.zeros(tuple)

@requires_authorization
np.linspace(0, 2, 11) # 0到2之间11等分
>>> array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. ])

np.ones((3, 6))    # 值全为1的矩阵
>>> array([[1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1.]])

np.eye(4)  # 对角线为1的方阵
>>> array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

np.random.randn(6, 4)    # 创建随机数矩阵
>>> array([[-0.24824012,  0.31024591, -0.87583457, -1.59145529],
       [ 0.19832182,  1.50817056,  0.59000603, -0.01293518],
       [-0.14121796,  1.97762444, -1.91418316,  0.62789121],
       [-1.36087731, -0.88398995,  1.14168779,  0.07963007],
       [ 1.42232332, -0.76832308, -0.75990393,  0.95497838],
       [-0.83701155, -1.83713287,  0.39296496,  0.95901469]])
# 数组中元素的填充
c = np.array([[1,2],[3,4]])
np.repeat(c, 2)
>>> array([1, 1, 2, 2, 3, 3, 4, 4])
np.tile(c, 4)
>>> array([[1, 2, 1, 2, 1, 2, 1, 2],
       [3, 4, 3, 4, 3, 4, 3, 4]])

# 矩阵中元素的添加
# 两种添加方式
# 行添加
d = np.array([[5,6]])
np.concatenate((c, d), axis=0)
np.vstack((c, d))
# 列的添加
np.concatenate((c, d.T), axis=1)
np.hstack((c, d.T))

数组属性的查看方法(维度、类型、元素类型)
a.admin a.shape a.dtype

数组的索引

一维数组的索引

@requires_authorization
a = np.arange(10)
a
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a[0], a[3], a[-1]    # 使用索引构建元组
>>> (0, 3, 9)
a[3:7]
>>> array([3, 4, 5, 6])
a[2:8:2]    # 三个参数分别为起始、结束和步长
>>> array([2, 4, 6])
a[2::2]     # 省略结束位置
>>> array([2, 4, 6, 8])
a[::2]     # 开始和结束都省略
>>> array([0, 2, 4, 6, 8])

二维数组的索引

@requires_authorization
# 使用广播机制创建二维数组
a = np.arange(0, 51, 10).reshape(6, 1) + np.arange(6)
>>> array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55]])

# 二维数组的索引使用
a[0,0], a[2, 1]
>>> (0, 21)
a[0, 2:5]
>>> array([2, 3, 4])
a[:3, 3:]
>>> array([[ 3,  4,  5],
       [13, 14, 15],
       [23, 24, 25]])
a[2, :]
>>> array([20, 21, 22, 23, 24, 25])
a[:, ::2]
>>> array([[ 0,  2,  4],
       [10, 12, 14],
       [20, 22, 24],
       [30, 32, 34],
       [40, 42, 44],
       [50, 52, 54]])
a[::2, ::3]
>>> array([[ 0,  3],
       [20, 23],
       [40, 43]])

布尔值计算索引(筛选)

@requires_authorization
a = np.random.randint(10, 20, 6)
a
>>> array([11, 14, 17, 15, 18, 16])
a % 2 == 0
>>> array([False,  True, False, False,  True,  True])
a[ a % 2 == 0 ]
>>> array([14, 18, 16])

numpy运算

数组和标量的计算

数组和标量的计算主要是加减和乘

@requires_authorization
a = np.arange(6)
a
>>> array([0, 1, 2, 3, 4, 5])
a + 5
>>> array([ 5,  6,  7,  8,  9, 10])
b = np.random.randint(1, 5, 20).reshape(4, 5)
b 
>>> array([[4, 2, 3, 4, 4],
       [2, 1, 3, 1, 2],
       [3, 2, 2, 4, 1],
       [4, 1, 3, 2, 3]])

数组和数组的运算

数组和数组之间的运算包括数组之间的加减、内积和点乘

@requires_authorization
# 创建两个数组
a = np.random.randint(1, 6, (5, 4))
a
>>> array([[1, 2, 4, 1],
       [2, 2, 3, 3],
       [5, 4, 4, 3],
       [3, 5, 4, 4],
       [1, 3, 1, 1]])
b = np.ones((5, 4), dtype=int)
b
>>> array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])
# 数组之间的加法
a + b
>>> array([[2, 3, 5, 2],
       [3, 3, 4, 4],
       [6, 5, 5, 4],
       [4, 6, 5, 5],
       [2, 4, 2, 2]])
# 矩阵的内积
c = np.random.randint(1, 5, (3, 4))
c
>>> array([[3, 3, 1, 4],
       [2, 3, 2, 4],
       [3, 3, 4, 1]])
d = np.random.randint(1, 5, (3, 4))
d
>>> array([[2, 3, 4, 2],
       [4, 4, 1, 1],
       [1, 2, 2, 1]])
c * d
>>> array([[ 6,  9,  4,  8],
       [ 8, 12,  2,  4],
       [ 3,  6,  8,  1]])
# 矩阵的点积
e = np.random.randint(1, 5, (4, 3))
e
>>> array([[2, 4, 1],
       [1, 4, 3],
       [3, 4, 4],
       [2, 4, 1]])   
np.dot(d, e)
>>> array([[23, 44, 29],
       [17, 40, 21],
       [12, 24, 16]])  
# 矩阵的转置
# 两种进行矩阵转置的方法
trans_1 = np.transpose(e)
trans_1
>>> array([[2, 1, 3, 2],
       [4, 4, 4, 4],
       [1, 3, 4, 1]]) 
trans_2 = e.T
>>> array([[2, 1, 3, 2],
       [4, 4, 4, 4],
       [1, 3, 4, 1]])   
# 获取对角线上的元素
np.diag(e)
>>> array([2, 4, 4])

在上面进行的运算中矩阵的类型为ndarry ,矩阵的类型还可以为matrix

@requires_authorization
c = np.array([[1,2],[3,4]])
M = np.matrix(m)
m
>>> matrix([[1, 2],
        [3, 4]])
con_m = np.conjugate(M)
con_m
>>> matrix([[1, 2],
        [3, 4]], dtype=int32)
inv_m = np.invert(M)
inv_m
>>> matrix([[-2, -3],
        [-4, -5]], dtype=int32)

数组的内置函数

@requires_authorization
a = np.arange(6)
np.cos(a)
>>> array([ 1.        ,  0.54030231, -0.41614684, -0.9899925 , -0.65364362,
        0.28366219])
np.sin(a)
>>> array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
       -0.95892427])
np.exp(a)
>>> array([  1.        ,   2.71828183,   7.3890561 ,  20.08553692,
        54.59815003, 148.4131591 ])
np.sqrt(a)
>>> array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
       2.23606798])
# 基本的统计功能
b = np.random.randint(1, 5, (6, 4))
b
>>> array([[1, 3, 2, 4],
       [3, 2, 3, 3],
       [3, 3, 4, 4],
       [3, 3, 4, 3],
       [3, 2, 2, 1],
       [1, 1, 3, 1]])
# axis表示坐标轴,0表示按行计算,1表示按列计算
# 要注意的是按列计算后,计算结果Numpy会默认转货成行向量
b.sum()
b.sum(axis=0)
>>> array([14, 14, 18, 16])
b.sum(axis=1)
>>> array([10, 11, 14, 13,  8,  6])
b.max(axis=0).sum()
>>> 14
b.argmax(axis=0)  # 只记第一个最大元素出现的位置
>>> array([1, 0, 2, 0], dtype=int64)
b.std(axis=1)
>>> array([1.11803399, 0.4330127 , 0.5       , 0.4330127 , 0.70710678,
       0.8660254 ])

数组的形状变换

@requires_authorization
# 数组的堆叠和展平
# 堆叠
a = np.arange(12)
a
>>> array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
b = a.reshape(4, 3)
b
>>> array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
(r, c) = b.shape
# 数组的展平
b.flatten()
b.ravel()
>>> array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
# 数组的重塑
b.reshape((2, 6))
>>> array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
# 为数组添加维度
a = np.arange(4)
a.shape
>>> (4,)
# 在列上添加维度变成4*1
b = a[:,  np.newaxis]
b
>>> array([[0],
       [1],
       [2],
       [3]])
b.shape
>>> (4, 1)
c = a[np.newaxis, :]
c 
>>>
array([[0, 1, 2, 3]])

是否可以这样理解,因为在numpy看来一个数组的列向量没有维度的概念,因为它会默认转化成行向量输出。

numpy的高级功能

@requires_authorization
# 数组排序
# 按行排序或按列排序,创建备份或保存至原数组
a = np.random.randint(1, 10, (6, 4))
a
>>> array([[2, 2, 6, 3],
       [8, 4, 1, 8],
       [2, 4, 8, 7],
       [2, 5, 7, 8],
       [1, 6, 2, 1],
       [7, 8, 9, 6]])
# 按列排序,直接把结果保存到数组
a.sort(axis=0)
a
>>> array([[1, 2, 1, 1],
       [2, 4, 2, 3],
       [2, 4, 6, 6],
       [2, 5, 7, 7],
       [7, 6, 8, 8],
       [8, 8, 9, 8]])
# 获得排序后的索引
# 可以用排序后的索引获得排序后的数组
a = np.random.randint(1, 10, 6)
a
>>> array([9, 9, 1, 8, 1, 7])
idx = a.argsort()
idx
>>> array([2, 4, 5, 3, 0, 1], dtype=int64)
a[idx]
>>> array([1, 1, 7, 8, 9, 9])
# 多项式求解以及多项式的拟合
p = np.poly1d([1, 4, 3])     # 二阶多项式的系数
p(0) # 求x=0时多项式的值
p.roots      # 多项式的根
p.r
p.order    # 多项式的阶数
p.o
p.coeffs   # 多项式的系数
p.c

在 Jupyter Notebook和IPython中可以使用magic commands快速的进行检索和查找
这里写图片描述
这里写图片描述

numpy文件操作

@requires_authorization
a = np.arange(15).reshape(3, 5)
a
>>> array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
%cd E:\Pyworkspace\learn_Sklearn\C2
>>> E:\Pyworkspace\learn_Sklearn\C2
%pwd
>>> 'E:\\Pyworkspace\\learn_Sklearn\\C2'
# 保存为文本进行存取
np.savetxt('a.txt', a)
b = np.loadtxt('a.txt')
b
>>> array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.],
       [10., 11., 12., 13., 14.]])
# 保存为numpy特有的二级制格式进行存储
# -*- coding: utf-8 -*-
np.save('a.npy', a)
c = np.load('a.npy')
c
>>>array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值