python自主学习——NumPy

NumPy

!!!个人主页:个人主页
!!!推荐一款模拟面试、刷题神器,从基础到大厂面试题:点击此处进入牛客网注册学习吧
!!!今日的努力,明日的未来

NUmPy基础


NumPy是高性能科学计算和数据分析地基础包
部分功能:

  • ndarray,一个具有矢量算术运算和复杂广播能力地快速且节省空间的多维数组
  • 用于数组对数组数据进行运算额标准数学函数
  • 用于读写磁盘数据的工具以及用于操作内存映射文件的工具
  • 线性代数、随机数生成以及傅里叶变换功能
  • 用于集成由C、C++、Fortran等语言编写代码工具

除了为Python提供快速的数组处理能力,Numpy在数据分析方面还有另外一个主要作用,即作为算法之间传递数据的容器

ndarray:一种多维数组对象


NumPy最重要的一个特点就是N维数组对象——ndarray(整个库的核心)该对象是一个快速而灵活的大数据容器,可以用他高效地储存大量地数值元素,提高数组运算速度,还能用各种拓展库进行数据交换

#生成两行四列地数据
import numpy as np
d = np.random.random((2,4))
print(d)
#还可以在此基础上进行数学运算操作
print(d+5)
print(d*10)

ndarray是一个通用地同构数据多维容器,其中地所有元素必须是相同类型地,并且这些元素地存储地址是连续地
每个数组都有一个shape(一个表示各维度地元组、可读可写)和一个dtype(一个用于说明数组类型地对象、可读不可写)

可以通过修改数组地shape属性,在保持数组元素个数不变地情况下,改变数组每个维度地大小。这时地改变只是改变了每个轴地大小,数组元素在内存中地位置没有改变。当设置某个轴地个数谓-1时,将自动计算此轴地长度(默认长度)

adarray地数据类型


dtype是一种特殊地对象,它含有ndarray将一块内存解释为特定数据类型所需地信息。多数情况下,他们直接映射到相应地机器表示,使得“读写磁盘上地二进制流”以及“集成低级语言代码”(如C、Fortran)等工作变得更加简单
**数值型dtype地命名方式:一个类型名(如float),后面跟上一个用于表示各元素位长地数字。**标准的双精度浮点值(float64).通常而言,数据大概有浮点数、复数、布尔值、字符串等
通过astype转换dtype

d.dtype
#float64
d.astype(np.float32)

检查ndarray


#元素的多少
d.size

#每个元素分配空间的大小(字节大小)
d.itemsize

# 维度
d.ndim


创建adarray


array(object,dtype = None,copy=Ttue,order='K',subok=False,ndmin=0)

#创建adarray
import numpy as np
#方式一
np.array([1,2,3])
#方式二
l = [1,2,3]
np.array(l)
#array([1, 2, 3])

l = [[1,2.0,3],[4,5,6]]
arr = np.array(l)
arr.dtype
#dtype('float64')——>由于其中有2.0,所以为浮点型

嵌套序列(比如一组等长列表组成的列表)将会被转换为一个多维数组
除非显式说明,np.array会尝试为新建的这个数组推断出一个较为合适的数据类型。数据类型保存在一个特殊的dtype对象中

新建数组的函数


创建指定形状和类型的数组

  • np.zeros(shape,dtype=float,order=‘C’)

    #用0填充
    np.zeros((2,4))
    #array([[0., 0., 0., 0.],
    #      [0., 0., 0., 0.]])
    
  • np.ones(shape,dtype=None,order=‘C’)

    #用1填充
    np.ones((2,3))
    #array([[1., 1., 1.],
    #       [1., 1., 1.]])
    
  • np.empty((shape,dtype=float,order=‘C’))

    # 填充的时未初始化的垃圾数据
    np.empty((2,3))
    #array([[1., 1., 1.],
    #       [1., 1., 1.]])
    
  • arange([start],stop,[step],dtype=None)

    #取值时步长的正负需要于取值的顺序相匹配,步长可以为小数
    np.arange(1,10,0.5)
    #array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,
    #       7.5, 8. , 8.5, 9. , 9.5])
    
  • np.random.random()

    np.random.random((2,3))
    
    #array([[0.61321178, 0.92205186, 0.46111761],
    #       [0.40873276, 0.63371544, 0.33524103]])
    

统计分析


  • np.max(a,axis=None,out=None,keepdims=<class’numpy._ globals. _ NoValue’)

    arr.max()
    np.max(arr)
    # axis = 0指的每一列的最大值,axis=1是每一行的最大值
    np.max(arr,axis=1)
    
  • np.min(a,axis=None,out=None,keepdims=<class’numpy._ globals. _ NoValue)

    np.min(arr1)
    np.min(arr1,axis=1)
    
  • np.mean(a,axis=None,out=None,keepdims=<class’numpy._ globals. _ NoValue)

    #取均值
    np.mean(arr,axis=1)
    

基本索引和切片


一维数组表面上看和Python列表差不多

arr = np.arange(10)
#将2,3,4赋值为0
arr[2:5] = 0
arr
#array([0, 1, 0, 0, 0, 5, 6, 7, 8, 9])

将一个标量值赋给一个切片时,该值会自动传播给一切片,该值会自动传播到整个选区
跟列表最重要的区别在于,数组切片是原始数组的视图。这就一位置数据不会被赋值,在视图上的任何修改都会反应到源数组上

arr_slice = arr[2:5]
arr_slice[1] = 123
arr_slice
arr
#array([  0,   1,   0, 123,   0,   5,   6,   7,   8,   9])

如果你想要得到的是ndarray切片的一份副本而非视图,需要显式地进行复制操作

arr_slice = arr[2:5].copy()
arr_slice[1] = 456
arr
# array([  0,   1,   0, 123,   0,   5,   6,   7,   8,   9])

对于高维数组,能做地事情更多。在一个二维数组中,个索引位置上地元素不再是标量而是一维数组:

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d[2]
#array([7, 8, 9])

#获取某一个值
arr2d[2][1]
arr2d[2,1]

因此,可以对各个元素进行递归访问。另外,可以传入一个以逗号隔开地索引列表来选取单一元素

在多维数组中,如果省略了后面的索引,则返回对象是一个维度低一点地ndarray(即返回地低维数组含有原始高维数组某条轴上地所有数据。括号外面地“维度”是一维、二维、三维、四维之类地意思,而括号里面因该理解为“轴”)

data_set = np.array([[[1, 2, 3], [4, 5, 6],[123,34,5]], [[7, 8, 9], [10, 11, 12]]])
data_set
#最外层是第0轴,而这里边是有两个元素,轴的长度为2(轴的长度就是元素的个数)
#下一层就是第1轴,,轴长为2
# 再往下就是第三轴,长度为3

高维数组的切片索引


可以在一个或多个轴上进行切片,也可以跟整数索引混合使用

花式索引


指的是利用整数数组进行索引。

a = np.arrange(32).reshape(8,4)
a

为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或adarray即可:

a[[2,0,4,1]]

使用负数索引将会从末尾开始选取行:

a[[3,-1]]

一次传入多个索引数组会有一点特别。他返回的是一个一维数组,其中的元素对应各个索引元组:

a[[2,3,4],[1,0,3]]

最终选出的是元素(2,1)(3,0),(4,3)

  1. 请用两种方法创建一个边界值为1而内部是0的二维数组
import numpy as np
a1 = np.ones((10,10),dtype=int)
a1[1:-1,1:-1]=0
print(a1)

b1= np.zeros((10,10),dtype=int)
b1[0]=1
b1[-1]=1
b1[1:-1,[0,-1]]=1
print(b1)
  1. 创建一个8×8的棋盘格
import numpy as np
ch = np.ones((8,8),dtype=int)
ch[1::2,::2]=0
ch[::2,1::2]=0
print(ch)
  1. 如何交换数组np.arange(9).reshape(3,3)中的第1列和第2列?
import numpy as np
dh = np.arange(9).reshape(3,3)
# print(dh)
dh[:,[1,0,2]]
  1. 如何交换数组np.arange(9).reshape(3,3)中的第1行和第2行?
import numpy as np
dh = np.arange(9).reshape(3,3)
dh[[1,0,2]]
  1. 如何从array[0,1,2,3,4,5,6,7,8,9]中取到大于5的数
import numpy as np
en = np.arange(10)
en[en>5]
en[en>5]=2
en
  1. 如何从nparray([0, 1, 2, 3, 4, 5, 6, 7, 8])中提取到所有奇数
import numpy as np
en = np.arange(10)
en[en%2==1]
  1. 已知a = np.random.random((3,5))-0.5,将a中小于0的数值改为0
import numpy as np
a = np.random.random((3,5))- 0.5
a[a<0]=0
a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值