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=https://www.it610.com/article/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)
【Numpy最终版】ValueError: cannot reshape array of size 10 into shape (3,newaxis)

    推荐阅读