Numpy概述以及ndarray结构

本篇文章主要包括两部分:

  numpy简介

  array结构介绍

一.numpy简介

  numpy是pyhon中一个非常常用的科学计算库,它主要用来处理对数组的运算,numpy的绝大部分API都是针对数组的操作,特别是多维数组。

  numpy的底层是一个ndarray结构,我们可以通过numpy.array(list)将一个列表转化为一个ndarry类型的数据结构。我们可以把ndarry结构看成是一个加强版的列表,它的本质仍然是一个列表,只是额外封装了一些方法和属性,使得它比list更加强大(也就是说,list能做的事,ndarray都能做,ndarray能做的事,list就不一定能做。正是有了ndarry结构,使得numpy能像matlab一样方便的操作数组)。与list相比,ndarray有如下特性:

  ndarray类型的数组可以直接加减乘除某一个常数

import numpy as np
list=[1,2,3,4]
array=np.array(list)
array+1  #对数组中的每一个元素+1
array*1  #对数组中每一个元素*1
array/2
array-1

  上面的操作若是对list进行,则会报错.

二.ndarray结构

1.numpy.array(list)将list转为array结构

import numpy as np
list=[1,2,3,4,5,6,7]
array=np.array(list)

2.为了方便数组的计算,ndarray中的数据类型应该是一致的,这与list有区别,如果在创建ndarray时,数据类型不一致,会自动向下转化为相同的数据类型

list=[1,2,3,4,5,6]
array=np.array(list) #list的数据类型都是int型,因此array的数据类型是int

list=[1,2.9,4.5,4.7]
array=np.array(list) #list的数据包含int和浮点型,array会自动把数据全部转为浮点型

list=[1,2,'uh',4]
array=np.array(list)  #list的数据中包含int和字符串,array会全部把数据转为字符串

3.ndarray基本属性操作

array=np.array([[1,2,3],
                 [3,4,5]])

type(array)   #返回array的数据类型(numpy.ndarray)

array.dtype  #返回array数组中的数据的数据类型

array.itemsize #数组中每一个数据所占的字节

array.shape  #数组的结构,返回一个元组,元组中的每一个数据代表着数组在每一维有多少个数据

array.size   #数组中元素的总个数

array.ndim  #返回数组的维度,即数组总共有多少维

array.fill(0) #用0来填充array,即将array的所有数据都变成0

4.ndarray的切片

  ndarray的切片操作和list的切片操作类似:

#######################################索引与切片操作

#1.一维矩阵的索引和切片操作与list完全一致
list=[1,2,3,4,5,6,8]
array=np.array(list)
array[0]   #返回索引为0的值(1)

array[1:5]  #返回索引从1到5的值(不包括5)
 
array[-1]   #返回最后一个元素


#2.多维矩阵的索引和切片操作与list类似
list=[[1,2,3],
      [4,5,6],
      [7,8,9]]
array=np.array(list)
array[0]    #返回索引为0的值,即第一行的元素(想想list[0]会返回什么值,这里是一致的)
array[1,1]  #返回第二行第二列的元素(索引从0开始)
array[:,1] #返回第二列元素
array[:2]  #返回前两行元素(注意区分有逗号和没有逗号的区别)

array[1,1]=10  #可以根据索引直接修改该位置的数据(与list一致)

array[0,0:2]  #可以结合索引和切片来查找矩阵中某些特定位置的数据,需要记住,矩阵的不同的维度是根据逗号分隔的



#3.矩阵的复制有深浅拷贝之分
array1=array  #浅拷贝,array1只是拷贝了array的一个引用,两个变量指向同一块内存(指向同一个矩阵),操作一个变量,另外一个变量值也会改变
array1[1,1]=10  #将array1的第二行第二列元素改为10,因为array1和array实际上指向同一个矩阵,因此array的第二行第二列元素也会变成10

array1=array.copy()  #深拷贝,array1和array是两个完全独立的矩阵,操作一个矩阵不会影响另外一个矩阵
array1[1,1]=100    #将array1的第二行第二列改为100,因为array1和array两个矩阵是相互独立的,因此array第二行第二列元素还是10,不会变成100


#4.arange函数和random.rand函数,根据布尔值来筛选数据

####arange函数的用法和range函数相同,两者区别在于,arange生成的是一个ndarray矩阵,range生成的是一个list
array=np.arange(0,100,10)#返回 array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

##生成一个布尔类型的矩阵

mask=np.array([0,1,0,1,1,0,0,1,0,1],dtype=bool)

##根据mask来筛选矩阵中的数据,返回array中以mask中值为1的索引作为索引的对应的值
####注意:mask的元素个数必须与array中元素个数相同,即mask.size==array.size
array[mask]  #返回array([10, 30, 40, 70, 90])

##除了自己定义一个bool矩阵之外,还可以利用array的数据大小来生成bool矩阵
mask=array>50 #mask是一个和array有着相同size的矩阵,若array[i]的值大于50,则mask[i]为true,否则为false
array[mask]   #使用这种方法可以很方便的在array矩阵中筛选出符合我们想要的数据
np.where(array>50)  #使用where方法可以查看符合条件的元素的位置


##random.rand()函数

#arry=np.random.rand(10)  #生成一个size=10的一维矩阵,矩阵的每一个元素的值在0-1之间
View Code

5.ndarry中元素的数据类型转换

#在创建矩阵时,可以通过指定dtype属性来指定矩阵数据的数据类型

array=np.array([1,2,3,4,5],dtype=np.float32)   #指定生成的数据是32位的浮点类型
array.nbytes    #计算矩阵的总共字节数(5*4=20)


##前面说过,ndarray类型的矩阵会将数据类型统一向下转为同一种类型,如果想让矩阵像list那样,矩阵的元素有不同的数据类型,可以使用object类型

array=np.array([1,2,'stre',4],dtype=np.object)  #生成的矩阵既有int类型的数据,又有字符串类型的数据


#除了可以在创建矩阵时指定dtype属性外,还可以使用asarray(),astype方法来实现矩阵数据类型的转换

array=np.array([1,2,3,4,5])
array1=np.asarray(array,dtype=np.float32)   #需要注意,这种转换不会改变array的数据类型,因此需要将转换后的矩阵赋给一个新的变量
array1=array.astype(dtype=np.float32)        #该方法也不会改变array的数据类型
View Code

  

原文地址:https://www.cnblogs.com/jiachuantang/p/8946122.html