科学计算库(二)numpy之ndarray

Numpy 官方文档:https://docs.scipy.org/doc/numpy/user/index.html

 

创建ndarray

ndarray,是Numpy的核心数据结构,元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型 ,ndarray的大小固定,创建好数组后数组大小是不会再发生改变的。

np.array(list、tuple) 将python序列转换成数组
字典dict转成ndarray的话是当做其中一个值来使用,无法正常转换

直接创建ndarray
np.zeros() 创建全0数组 np.zeros(3)、np.zeros([3,4])。
np.ones() 全1数组,float类型的1。
np.empty() 空数组,未初始化,数值不确定。

其他创建方式
arange() 类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值
    np.arange(0,100)  生成一个一维数组,0-99的数值。arange默认是从0开始的,所以可以写成  np.arange(100)
    np.arange(0,100,2) 步长为2,生成0/2/4/6/8.../98 的数组
    np.arange(100,0,-2)  步长为-2
    np.arange(0,100,2.5) 步数可以是float
linspace(start,end,num) 生成等差数列,生成num个数值的数组
logspace(num1,num2,total,base) 生成等比数列,base的num1次方到base的num2次方,生成total个数值的数组

random() 生成随机数数组
     np.random.random([3,3]) 创建0-1之间的随机元素,数组包含的元素数量由参数决定
     np.random.randint(0,2,[10,10]) 左闭右开 不包括2,0或者1数值的10*10的数组
     np.random.randn(num) 正态分布数组

对象属性

ndim  数组轴个数
shape 维度,数组的形状
size 元素总个数
dtype 数据类型
itemsize 每个元素的字节大小


数据类型 dtype

创建数组的时候可以显示设置dtype,不设置会自动根据内容生成dtype类型
np.array(list,dtype="int8") 创建的时候可以设置数据类型
创建好数组之后,不能修改数据类型
但可以通过astype 复制新数组设置新的数据类型

数据类型类型简写说明

int_

 

默认整形

intc

 

等价于long的整形

int8

i1

字节整形,1个字节,范围:[-128,127]

int16

i2

整形,2个字节,范围:[-32768,32767]

int32

i4

整形,4个字节,范围:[-2^31, 2^31-1]

int64

i8

整形,8个字节,范围:[-2^63, 2^63-1]

uint8

u1

无符号整形, 1个字节, 范围:[0,255]

uint16

u2

无符号整形, 2个字节, 范围:[0,65535]

uint32

u4

无符号整形, 1个字节, 范围:[0, 2^32-1]

uint64

u8

无符号整形, 1个字节, 范围:[0,2^64-1]

bool_

 

以一个字节形成存储的布尔值(True或者False)

float_

 

float64简写形式

float16

F2

半精度浮点型(2字节):1符号位+5位指数+10位的小数部分

float32

f4或者f

单精度浮点型(4字节):1符号位+8位指数+23位的小数部分

float64

f8或者d

双精度浮点型(8字节):1符号位+11位指数+52位的小数部分

complex_

c16

complex128的简写形式

complex64

c8

复数,由两个32位的浮点数来表示

complex128

c16

复数,由两个64位的浮点数来表示

object

O

Python对象类型

String_

S

固定长度的字符串类型(每个字符1个字节),比如:要创建一个长度为8的字符串,应该使用S8

Unicode_

U

固定长度的unicode类型的字符串(每个字符占用字节数由平台决定),长度定义类似String_类型


 

修改形状


arr.shape=(2,6)  直接修改shape值修改形状
arr2=arr1.reshape(2,-1) 通过reshape修改形状,-1自动计算
arr2=arr1.reshape(-1) 降为 一维

基本操作


数值运算,矢量化运算
数组+-/*数值:每个值都做运算

元素级操作
如果两个数组的形状相同,那么会是对于位置元素的运算
arr1+arr2如下运算过程

广播的原则

广播的原则:如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符,或其中的一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。

这句话乃是理解广播的核心。广播主要发生在两种情况,一种是两个数组的维数不相等,但是它们的后缘维度的轴长相符,另外一种是有一方的长度为1。


arr1(5,7)+-/*arr2(5,1) 每一行的每个值都会和arr2对于行数的数组运算

arr = np.arange(35)
arr1 = np.reshape(arr,[5,-1])
print(arr1)
arr2=[
    [1],
    [2],
    [3],
    [4],
    [5]]
print(arr2)
arr1+arr2

输出结果 

[[ 0  1  2  3  4  5  6]               [[1], 
 [ 7  8  9 10 11 12 13]                [2], 
 [14 15 16 17 18 19 20]       +        [3],           
 [21 22 23 24 25 26 27]                [4], 
 [28 29 30 31 32 33 34]]               [5]]

每一行广播相加对应行的值

=array([[ 1,  2,  3,  4,  5,  6,  7],
       [ 9, 10, 11, 12, 13, 14, 15],
       [17, 18, 19, 20, 21, 22, 23],
       [25, 26, 27, 28, 29, 30, 31],
       [33, 34, 35, 36, 37, 38, 39]])


arr1(5,7)+-/*arr2(1,7) 对每一列进行操作,可以写成arr2(7),会自动广播成arr2(1,7),后缘维度相同即可

arr = np.arange(35)
arr1 = np.reshape(arr,[5,-1])
print(arr1)
arr2=[1,2,3,4,5,6,7]
print(arr2)
arr1+arr2

输出结果

[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]
 [21 22 23 24 25 26 27]
 [28 29 30 31 32 33 34]]
           +
 [1, 2, 3, 4, 5, 6, 7]
           =
[[ 1,  3,  5,  7,  9, 11, 13],
 [ 8, 10, 12, 14, 16, 18, 20],
 [15, 17, 19, 21, 23, 25, 27],
 [22, 24, 26, 28, 30, 32, 34],
 [29, 31, 33, 35, 37, 39, 41]])

矩阵积

第一个数组的行=第二个数组的列 arr1(m,n) dot arr2(n,k) = arr3(m,k)


使用方法 np.dot(arr1,arr2)

数组索引

数组下角标arr[2][2],-1 代表最后一个。
简写 arr[2,2]    numpy自带索引方式,每个维度用逗号隔开

切片操作

在各维度上单独切片,如果某维度都保留,则使用:冒号,不指定初始值和终止值。

切出来的是子视图,对子视图的修改,会直接影响原数组

 

花式索引

数组=arr(6,6)
1、获取1,3,4行
arr[[0,2,3]]
2、获取第一列和最后一列
arr[:,[0,-1]]
3、获取第1,3行和第2,4
arr[[0,2]][:,[1,3]] # 先取到行,然后再切所有行的指定列
arr[[0,2]].T[[1,3]].T #先取行,转置再取行,再转置
也可以使用 np.ix_()索引器
arr[np.ix_([0,2],[1,3])]
arr[[0,2],[1,3]] 是错误的,获取到的是0,1数据和2,3数据,只有两个值

花式索引得到的子集数组是一个新的数组,修改新数组数据不会影响原数据。

布尔索引

找数组中的偶数
condition=arr%2==0,
arr[condition]

数组arr会降为成一维数组
数组中值大于20并且是偶数(&且     |或)
arr[(arr%2==0) & (arr>20)]

按行列放布尔索引,arr[[行布尔索引],[列布尔索引]]

arr[[True,False,True,False,False,False],[False,True,False,False,False,False]]

索引结果:第1和3行的第2列,两个数值组成的数组

 

数组转置与轴对换

转置:行列转换
arr.T
三维转置 arr(2,3,4),arr.T为(4,3,2) 值怎么放?

transpose()轴对换
arr(2,3,4)
arr.transpose() #默认是转置操作,也就是2,1,0
arr.transpose(1,2,0) #指定对换轴,(3,4,2)

 

数组拉伸

np.tile(arr,rep),rep是拉伸的倍数
横向拉伸
arr(5,3)
np.tile(arr,2) 横向拉伸2倍
纵向拉伸
np.tile(arr,[2,1]) 纵向拉伸2倍。0轴*2,1轴*1

 

数组合并

vstack 垂直合并

arr1(5,3)与arr2(9,3)
np.vstack([arr1,arr2]) #垂直堆叠两个数组,变成arr(14,3)

hstack水平合并
arr1(5,3)与arr2(5,2)
np.hstack([arr1,arr2]) #水平堆叠,变成arr(5,5)


stack 沿着新的轴进行数据合并,会拓展出一个新轴
arr1(3,5) arr2(3,5)
np.stack([arr1,arr2],axis=0) 变成 arr(2,3,5)
np.stack([arr1,arr2],axis=1) 变成 arr(3,2,5)
np.stack([arr1,arr2],axis=2) 变成 arr(3,5,2) 
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值