Numpy最终版

import numpy as np
np.__version__
'1.15.2'

为什么要使用numpy?

Python list 的特点

L = [i for i in range(10)]
L

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
L[5]
5
L[5] = 100
L
[0, 1, 2, 3, 4, 100, 6, 7, 8, 9]
L[5] = 'Data Analysis'
L
[0, 1, 2, 3, 4, 'Data Analysis', 6, 7, 8, 9]

python中的list 是不对存储类型做约束, 优点 灵活 缺点 性能 因为要检查每个元素的类型

python 中也有专门存储一种数据的数组

import array
arr = array.array('i', [i for i in range(10)])
# 'i'  表示整型
arr
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
arr[5] = 100
arr
array('i', [0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
type(arr)
array.array
# arr[5] = 'Data Analysis'

TypeError Traceback (most recent call last)
in ()
----> 1 arr[5] = 'Data Analysis'

TypeError: an integer is required (got type str)

优点 :效率高 缺点 :只能存储一种类型,当做一个二维数组 没有看做向量 或者矩阵 没有配备相应的运算

由此numpy应运而生

nparr = np.array([i for i in range(10)])
nparr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
nparr[5]
5
# 修改值
nparr[5] = 100
nparr
array([  0,   1,   2,   3,   4, 100,   6,   7,   8,   9])
# 同样会报错 只能存一种类型
#nparr[5] = 'Data Analysis'
# 特殊方法   
nparr.dtype
dtype('int64')
nparr[5] = 3.14
nparr
array([0, 1, 2, 3, 4, 3, 6, 7, 8, 9])
# 进行了一次隐式转换 进行截位 
nparr.dtype
dtype('int64')
# 我们大多数在机器学习和数据分析创建的类型都是浮点数
# 第二种创建 numpy 的方式
nparr2= np.array([1, 2, 3.0])
nparr2
array([1., 2., 3.])
nparr2.dtype
dtype('float64')

其他创建 numpy.array 的方法

np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros(10).dtype
dtype('float64')
np.zeros(10, dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  • 传入元组参数
np.zeros((3, 5))
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
  • 3 x 5 的全零矩阵
np.zeros(shape=(3, 5), dtype=int)
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3, 5))
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
# 全都是指定值的矩阵
np.full((3, 5), 666) 
array([[666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666]])
# 上面显示参数的写法  fill_value=666  和  fill_value=666.0 可以决定类型
np.full(shape=(3, 5),fill_value=666)
array([[666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666],
       [666, 666, 666, 666, 666]])

传参写不写 变量名 方便他人阅读 传两个以上的参数建议写

arange函数 相当于py 的range()

  • 左闭右开 步长
# python中range()的用法
[i for i in range(0, 20, 2)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
np.arange(0, 20, 2)
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
# [i for i in range(0, 1, 0.2)]
# 报下面的错误 不能传入浮点数    TypeError: 'float' object cannot be interpreted as an integer

但是arange的步长可以是浮点数

np.arange(0, 1, 0.2)
array([0. , 0.2, 0.4, 0.6, 0.8])
# 默认步长为1
np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 省略起始点 
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
[i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

numpy中还有一个和arange()像的函数

linspace

# 包括[0,20]的等长的十个点 (9个间距)  形成等差数列
np.linspace(0, 20, 10)
array([ 0.        ,  2.22222222,  4.44444444,  6.66666667,  8.88888889,
       11.11111111, 13.33333333, 15.55555556, 17.77777778, 20.        ])
# 要形成以2位=为步长  11 个点  (10个间距)  
np.linspace(0, 20, 11)
array([ 0.,  2.,  4.,  6.,  8., 10., 12., 14., 16., 18., 20.])

随机数 random

  • randin
np.random.randint(0, 10)    # [0, 10)之间的随机数
5
  • 生成一维数组 向量 第三个参数是数组个数
np.random.randint(0, 10, 10)
array([9, 8, 4, 1, 8, 0, 7, 9, 1, 6])

左闭右开

# 验证左闭右开
np.random.randint(0, 1, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
# size=10标识方便阅读
np.random.randint(4, 8, size=10)
array([6, 6, 4, 4, 4, 5, 5, 5, 6, 5])
# 生成3 x 5 矩阵
np.random.randint(0, 10, size=(3,5))
array([[9, 6, 4, 4, 2],
       [6, 9, 5, 1, 9],
       [7, 7, 5, 3, 6]])

之后我们要经常使用随机矩阵,那么随机性使得每次结果不一样,计算机中的数字都是伪随机的,靠随机数生成算法
推动这个算法生成的随机数都会有一个随机种子 ,我们可以显示指定

seed函数

np.random.seed(666)
np.random.randint(0, 10, size=(3, 5))
array([[4, 4, 0, 0, 4],
       [0, 4, 5, 7, 1],
       [0, 0, 6, 6, 0]])
np.random.seed(666)
np.random.randint(0, 10, size=(3,5))
array([[2, 6, 9, 4, 3],
       [1, 0, 8, 7, 5],
       [2, 5, 5, 4, 8]])
# 总结 seed666  一致

random 随机浮点数

# 生成[0,1)之间的随机浮点数 
np.random.random()
0.2683298107038842
# 可以显示的指定 size=10
np.random.random(10)
array([0.63279787, 0.18935861, 0.1308497 , 0.75765845, 0.34158167,
       0.52138487, 0.88302327, 0.44914216, 0.23902229, 0.33014086])
np.random.random((3,5))
array([[0.26650938, 0.79768204, 0.05551712, 0.12980746, 0.82262638],
       [0.36076783, 0.56970121, 0.83023273, 0.44767601, 0.2132831 ],
       [0.56115445, 0.71657783, 0.7493205 , 0.58624783, 0.54759891]])

以上是 0 ~ 1之间均匀的浮点数

  • 有的时候需要正太分布的随机数
  • 均值为0 方差 为1 的随机浮点数
# 均值为0 方差 为1 的随机浮点数 
np.random.normal()
-0.16835626126560016

均值为10 方差 为100

np.random.normal(10, 100)
-66.97676239131684
# 均值为0 方差 为1 3x5矩阵(size)
np.random.normal(0, 1, (3, 5))
array([[-0.76477299,  0.10761758,  0.29765915, -0.20175624,  0.19436849],
       [-0.43672616, -0.81171323, -1.46103885, -1.04532478, -1.38852421],
       [ 2.41334827,  0.59300083,  0.62047343,  0.47576512,  0.86748134]])
np.random.normal?
# 在notebook里面查看
help(np.random.normal)

05 numpy.array 基本操作

import numpy as np
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# reshape 一维转化为 二维 3x5
X = np.arange(15).reshape((3, 5))
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

基本属性

  • 查看数组维度
x.ndim
1
X.ndim
2
  • shape属性 返回元组 x为一维
x.shape  # 数组的样子
(10,)
X.shape
(3, 5)

元素个数

x.size

10
X.size
15

numpy.array 的数据访问

x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[0]
0
x[-1]
9
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
X[0][0] # 不建议!
0
X[(0,0)]
0
X[0, 0]
0
X[0, -1]
4
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[0:5]
array([0, 1, 2, 3, 4])
x[:5]
array([0, 1, 2, 3, 4])
x[5:]
array([5, 6, 7, 8, 9])
x[4:7]
array([4, 5, 6])
  • 步长
x[::2]
array([0, 2, 4, 6, 8])
x[1::2]
array([1, 3, 5, 7, 9])
x[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
  • 数组切片
X[:2, :3]
array([[0, 1, 2],
       [5, 6, 7]])
X[:2][:3] # 结果不一样,在numpy中使用","做多维索引
#
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
X[:2]
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
X[:2][:3]#是在上面的基础上进行切片 但数组中只有2个元素(实际是[:3]代表取三个)
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
X[:2, ::2]
array([[0, 2, 4],
       [5, 7, 9]])
X[::-1, ::-1]#矩阵反转
array([[14, 13, 12, 11, 10],
       [ 9,  8,  7,  6,  5],
       [ 4,  3,  2,  1,  0]])
X[0, :] #降低唯独  变成一维度  向量
array([0, 1, 2, 3, 4])
X[0, :].ndim
1
X[:, 0]
array([ 0,  5, 10])

以上切片获取了X 的子矩阵,子数组和python中的list有很大区别

Subarray of numpy.array

subX = X[:2, :3]
subX
array([[0, 1, 2],
       [5, 6, 7]])
subX[0, 0] = 100
subX
array([[100,   1,   2],
       [  5,   6,   7]])
  • 但是元=原矩阵X到底有没有变呢 不像list那样会创建新的矩阵,会影响X
X
array([[100,   1,   2,   3,   4],
       [  5,   6,   7,   8,   9],
       [ 10,  11,  12,  13,  14]])
X[0, 0] = 0
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

创建的subX和原矩阵无关的副本

subX = X[:2, :3].copy()
subX[0, 0] = 100
subX
array([[100,   1,   2],
       [  5,   6,   7]])
X
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

Reshape

x.shape
(10,)
x.ndim
1
x.reshape(2, 5)
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
A = x.reshape(2, 5)
A
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
B = x.reshape(1, 10)
B
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
B.ndim
2
B.shape
(1, 10)
x.reshape(-1, 10)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
x.reshape(10, -1)
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
x.reshape(2, -1)
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
#x.reshape(3, -1)

报错


ValueError Traceback (most recent call last)
in ()
----> 1 x.reshape(3, -1)

ValueError: cannot reshape array of size 10 into shape (3,newaxis)

你可能感兴趣的:(Numpy最终版)