Numpy 基本操作

**

NumPy

**

  1. NumPy是什么
    NumPy是一个开源的Python科学计算库。Numerical Python
  2. 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基础之数组创建

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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值