**
NumPy
**
- NumPy是什么
NumPy是一个开源的Python科学计算库。Numerical Python - NumPy有什么功能
NumPy主要的功能之一用来操作数组和矩阵。
NumPy是科学计算、深度学习等高端领域的必备工具。
使用TensorFlow、Caffe框架训练神经网络模型时,需要进行大量复杂的运算,可以直接调用NumPy里面的API。
NumPy还包含了很多使用的数学函数,覆盖了很多的数学领域,比如,线性代数、傅里叶变换、随机数生成。
Numpy基础之ndarray
Numpy最重要的一个特点就是N维数组对象(即ndarray)该对象是一个快速灵活的大数据集合容器。可以利用这个数组对整块数据执行一些数学运算,其语法跟标量元素之间的运算一样。
Ndarray(N-demensional array)
import numpy as np
a=[1,2,3,4,5,6,4,8,9]
print(a)
[1, 2, 3, 4, 5, 6, 4, 8, 9]
a*2
[1, 2, 3, 4, 5, 6, 4, 8, 9, 1, 2, 3, 4, 5, 6, 4, 8, 9]
print(type(a))#列表
<class 'list'>
A=np.array(a)#把普通python中list转换ndarray
print(A)
[1 2 3 4 5 6 4 8 9]
print(type(A))
<class 'numpy.ndarray'>
A*2
array([ 2, 4, 6, 8, 10, 12, 8, 16, 18])
#直接创建一维数组
b=np.array([1,2,3,4,5])
print(b)
print(type(b))
[1 2 3 4 5]
<class 'numpy.ndarray'>
b*6
array([ 6, 12, 18, 24, 30])
#创建多维数组
c=np.array([[1,2,3],[4,5,6]])
print(c)
print(type(c))
[[1 2 3]
[4 5 6]]
<class 'numpy.ndarray'>
c*2
array([[ 2, 4, 6],
[ 8, 10, 12]])
cc=([[1,2,3],[4,5,6]])
cc*2
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
Numpy基础之数组属性
ndarray.ndim
数组轴的个数,也被称作秩
ndarray.shape
数组在每个维度上大小的整数元组
ndarray.size
数组元素的总个数
ndarray.dtype
数组元素的数据类型,dtype类型可以用于创建数组中
print(c.ndim)#数组轴的个数,秩(最外层括号)
2
print(c.shape)#数组在每个维度大小的整数元组(几行几列)
(2, 3)
print(c.size)#数组元素的总个数
6
print(c.dtype)#数组元素的内部数类型,dtype类型可以用在创建数组中
int32
d=np.array([[[1,2,3],[4,5,6],[7,8,9]]])
print(d)
print(d.ndim)
[[[1 2 3]
[4 5 6]
[7 8 9]]]
3
print(d.shape)#去掉一层剩下的
(1, 3, 3)
print(d.size)
9
#指定维度来创建多维数组
e=np.array([1,2,3,4,5,6],ndmin=3)
print(e)
[[[1 2 3 4 5 6]]]
print(e.shape)
(1, 1, 6)
print(e.itemsize)
4
#指定维度和数值类型来创建多维数组
f=np.array([1,2,3,4,5,6],ndmin=3,dtype=np.complex)
print(f)
[[[1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j]]]
C:\Users\86139\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: DeprecationWarning: `np.complex` is a deprecated alias for the builtin `complex`. To silence this warning, use `complex` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.complex128` here.
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
Numpy基础之数据类型
NumPy 支持比 Python更多种类的数值类型
数据类型对象 (dtype)
查看ndarray的数据类型:dtype
numpy. empty ()
numpy.zeros ()
numpy.zeros_like()
numpy.ones()
numpy.ones_like()
Numpy.eye()
#numpy. empty以随机的方式来创建数组
a = np.empty([3,2],dtype=np.int32)
print(a)
[[1 2]
[3 4]
[5 6]]
#numpy.zeros返回指定大小的数组,并且以0作为填充
b = np.zeros ([5,6], dtype=np.float32)
print(b)
[[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0.]]
c = np.array([[1,2,3],[4,5,6]], dtype=np.float32)
print(c)
[[1. 2. 3.]
[4. 5. 6.]]
d = np.zeros_like(c)
print (d)
[[0. 0. 0.]
[0. 0. 0.]]
#nunmp. ones返回指定数组大小的数组,并且以1来填充
a = np. ones ([3,4],dtype=np.float32)
print(a)
[[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
b = np.array([[1,2,3,4,5],[6,7,8,9,10]], dtype=np.float32)
print(b)
[[ 1. 2. 3. 4. 5.]
[ 6. 7. 8. 9. 10.]]
c = np. ones_like(b)
print(c)
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
#numpy. eye函数返回对角线为1,其余为零的数组
d=np.eye(5)
print(d)
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
d=np.eye(5,dtype=np.int32)
print(d)
[[1 0 0 0 0]
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]]
Numpy基础之数组创建
numpy.asarray ()
numpy.logspace()
numpy.arange()
numpy. linspace()
#numpy.asarray()主要是把python中的list和元组转换成numpy中的ndarray
x =[1,2,3,4,5,6]
a = np.asarray(x)
print(type(x))
print(type(a))
print()
<class 'list'>
<class 'numpy.ndarray'>
[1, 2, 3, 4, 5, 6]
[1 2 3 4 5 6]
np.asarray()与np.array()的区别
在numpy中,asarray()函数与array()函数都可迭代对象转换为ndarray类型,它们之间的区别是:
1.当传入的参数是list等一般数组类型时,两者没有区别
a=[1,2,3]
b1=np.array(a) 深拷贝
b2=np.asarray(a)
a[0]=4
print(a)
print(b1)
print(b2)
输入:
[4,2,3]
[1,2,3]
[1,2,3]
2.当传入参数是ndarray类型时,array()函数会拷贝原数据,开辟新的内存在储存它,就是新建了一个ndarray对象。而asarray与原参数共享容一个内存
a = np.arange(3)
bl = np.array (a)
b2 = np.asarray (a)
a[0]=4
print(a)
print(bl)
print(b2)
输出:
[4 1 2]
[0 1 2]
[4 1 2]
从asarray()的源代码也可以看出asarray()和array()的区别:
def asarray (a,dtype-None,order=None,*, like=None):
if like is not None:
return _ asarray_with_like(a,dtype=dtype,order=order,like=like)
return array(a,dtype,copy=False,order=order)
还可以改变 array()函数的copy参数来控制它是否拷贝传入的数组
numpy.asarray ()
numpy.logspace( )
numpy.arange()
numpy.linspace()
arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值.
linspace函数通过指定开始值、终值和元素个数来创建一维数组可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值
x=np.arange(10)
print(type(x))
print(x)
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
x=np.arange(10,dtype=np.float32)
print(x)
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
np.linspace(0,1,10)
array([0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,
0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
np.linspace(0,1,10,endpoint=False)#默认为True
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
#i logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(10^0)到100(10^2)、有20个元素的等比数列
np.logspace(0,2,20)# 1 (10^0)到100(10^2)
array([ 1. , 1.27427499, 1.62377674, 2.06913808,
2.6366509 , 3.35981829, 4.2813324 , 5.45559478,
6.95192796, 8.8586679 , 11.28837892, 14.38449888,
18.32980711, 23.35721469, 29.76351442, 37.92690191,
48.32930239, 61.58482111, 78.47599704, 100. ])
Numpy 进阶之切片与索引
Numpy数组元素的存取方法和Python的索引切片方法相同.
Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间.
a=np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b=a[3:7]
b
array([3, 4, 5, 6])
b[2]=-10
b
array([ 3, 4, -10, 6])
a
array([ 0, 1, 2, 3, 4, -10, 6, 7, 8, 9])
id(b)
1772733269688
数据的浅拷贝与深拷贝
浅拷贝
共享内存地址的两个变量,
当其中一
个变量的值改变时另一个变量的值也随之改变。此时,变量间的“搓”是
“浅拷贝”
a=np.array([-45,-66,2,25,-33])
b=a
b is a#True
id(a)#2150984309776
id(b)#2150984309776
a==b
array([ True, True, True, True, True])
a[0]=6
a
array([ 6, -66, 2, 25, -33])
b
array([ 6, -66, 2, 25, -33])
#如果内存地址不一样
c=np.array([-45,-66,2,99,-33])
d=np.array([-45,-66,2,99,-33])
id(c)#2150984309776
id(d)#2150984307600
c==d
array([ True, True, True, True, True])
c[1]=666
c
array([-45, 666, 2, 99, -33])
d
array([-45, -66, 2, 99, -33])
浅拷贝–ndarray.view()
共享“视图”(view)的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变此时,变量间的“拷贝”也是“浅拷贝”
e=np.array([-45,-66,2,25,99,-33])
f=e.view()#f与e“共享视图”
id(e)
2479741897960
id(f)
2479741896640
f.shape=(2,3)
f
array([[-45, -66, 2],
[ 25, 99, -33]])
e[0]=0
e
array([ 0, -66, 2, 25, 99, -33])
f
array([[ 0, -66, 2],
[ 25, 99, -33]])
f[1,1]=88
f
array([[ 0, -66, 2],
[ 25, 88, -33]])
e
array([ 0, -66, 2, 25, 88, -33])
Nummpy中的深拷贝—np.copy
通过“深拷贝”得到的变量互不干扰,其中一个变量的值改变时,不影响其他变量的值。
e
array([ 0, -66, 2, 25, 88, -33])
g=np.copy(e)
g
array([ 0, -66, 2, 25, 88, -33])
e[0]=8
e
array([ 8, -66, 2, 25, 88, -33])
g
array([ 0, -66, 2, 25, 88, -33])
id(e)
2479741897960
id(g)
2479741974376
存取元素
存取元素中的“浅拷贝”与“深拷贝”
使用整数序列
当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。
x=np.arange(10,1,-1)
x
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
x[[3,3,1,8]]
array([7, 7, 9, 2])
b=x[np.array([3,3,-3,8])]
b
array([7, 7, 4, 2])
b[2]=100
b
array([ 7, 7, 100, 2])
x #由于b和lx不共享数据空间,因此x中的值并没有改变b
array([10, 9, 8, 7, 6, 5, 4, 3, 2])
x[[3,5,1]] = -1,-2,-3 #整数序列下标也可以用来修改元素的值
x
array([10, -3, 8, -1, 6, -2, 4, 3, 2])
当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
x=np.arange(5,0,-1)
x
array([5, 4, 3, 2, 1])
x[np.array([True,False,True,False,False])]#布尔数组中下标为0,2的元素为True,因此获取x中下标为0,2的元素
array([5, 3])
x[np.array([True,False,True,True,False])] =-1,-2,-3#布尔数组下标也可以用来修改元素
x
array([-1, 4, -2, -3, 1])
x=np.random.rand(10)#产生一个长度为10,元素值为0-1的随机数的数组
x
array([6.40811556e-05, 9.42528775e-01, 5.33198699e-01, 9.73780876e-01,
8.03239565e-01, 7.22867344e-01, 1.69954916e-01, 2.80447701e-01,
8.37202073e-01, 2.85337760e-01])
x[x>0.5]
array([0.94252878, 0.5331987 , 0.97378088, 0.80323957, 0.72286734,
0.83720207])