二维数组的切片和运算操作

首先导入模块

import numpy as npy

创建数组:

s = npy.array([[ 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 ]])
查看数组属性:
name.ndim #数组的维度

 name.size #数组元素个数
 
 name.dtype # 数组的数据类型
 
根据条件筛选数组元素:
名字:
name = npy.array(['a','b','c'])

科目(假定的难得写具体的):
sub=npy.array(['a1','a2','a3','a4','a5','a6','a7','a8','a9','a10'])

name[(name=='a')|(name =='b')]
array(['a', 'b'], dtype='<U1')

name[ ]

切片操作:

1)访问指定的行列的情况:
arr[  row , column ]
row 为行序列号
column 为列序列号
s[[1,0],[1,2]]

出现的元素:
array([12,  3])

这种情况表示的是 抽取
行序列号为1,列序列号为1 的元素 12

行序列号为0,列序列号为2的元素 3

访问部分元素:

① 访问部分行元素的时候给出行列表即可,列索引“ :”可以省略

s[[0,2]]

表示访问第1 行(默认第一列下标为0)和第二行的所有元素
结果:

array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]])

② 访问部分列元素:

s[ : , [ 0 , 6 ]]

输出结果:
array([[ 1,  7],
       [11, 17],
       [21, 27]])

前面的 “ :” 不能省略,否则无法识别切片。
代表访问的是 第1列和第7列 的所有数据

③访问固定行的某一段列数据:

s[ [0,2],1:5]

输出结果:
array([[ 2,  3,  4,  5],
       [22, 23, 24, 25]])

表示的是输出第1行和第3行的2到6列的数据

条件筛选 可以使用bool 类型的数组来访问其他类型数组的元素。用于筛选的bool 数组,需要具有与访问数组相同的行数和列数。如若筛选莫行的列数和行数的话:

注意下面要用到前面写过的数据

k = (name=='a')|(name =='b')#k为a的那一列和b的那一列
name[k]
array(['a', 'b'], dtype='<U1')#输出的就是a和b

k = (name=='a')|(name =='b')
k
array([ True,  True, False])#检查是否是哪一列(应该是有一种代表吧)

s[(name == 'a')|(name == 'b'),:]
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]])

上面就用到了切片的知识和那个位置(感觉比c好用多了)

s[(name == 'a')|(name == 'b')][:,(sub=="a3")|(sub=="a5")]
array([[ 3,  5],
       [13, 15]])

这里需要注意两点 1 他有两个【】【】 ,所以在写的时候要明白意思(目前不知道意思)

—————————————————————————————

创建多维数组的方法

arange函数

arange()函数可以给定的起始范围和步长,生成一个由数值序列组成的数组,规则与列表索引相同,如生成从0 开始到10结束的连续整数数组;:

arange(   开始值 , 末尾值-1 ,步长   )
 npy.arange(0,11)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
npy.arange(1,100,8)
array([ 1,  9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97])

浮点数也没问题

reshape()函数

是用reshape 函数可以将一维数组转换成指定的多维数组,如将有15个连续整数的一维数组转换成3*5的二维数组

reshape( 行数 ,列数 )

npy.arange(1,16).reshape(3,5)
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15]])
zeros()函数 和ones()函数

zeros 函数和ones函数生成指定大小的全为0 和1的数组,如分别生成34 和43的全1数组

 npy.zeros((3,4))
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
npy.ones((4,3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

zeros 和 ones 的参数都是元组( n ,m )其中n为行 m为列

多维数组的运输操作:

为所有同学的成绩加上5分:
 s+5
array([[ 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, 35]])
加上一个数组:

创建一个a 数组,其中的ones 里面应该是元组

a = npy.ones((3,10))+6
a+s
array([[ 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., 35., 36., 37.]])

看看a 中的元素是多少:

a
array([[7., 7., 7., 7., 7., 7., 7., 7., 7., 7.],
       [7., 7., 7., 7., 7., 7., 7., 7., 7., 7.],
       [7., 7., 7., 7., 7., 7., 7., 7., 7., 7.]])
       

上诉加法采用的是广播机制先把标量5转化成数组,再和s 按位相加得到新的数组

二维数组和一维数组的运算:

由于每一科的基础分不同 所以还应该加一个基础分。首先创建一个一维数组来存放不同科目增加的分数,再和 s 相加:

b=npy.array([1,2,3,4,5,6,7,8,9,10])
s+b
array([[ 2,  4,  6,  8, 10, 12, 14, 16, 18, 20],
       [12, 14, 16, 18, 20, 22, 24, 26, 28, 30],
       [22, 24, 26, 28, 30, 32, 34, 36, 38, 40]])

上诉做法也采用的是广播机制,先把b变成和s列行相同的二维数组,再和scores相加

选定元素运输:

如给a这个人的a3 这个科目上面加5分:

>>> s[name == 'a',sub == "a3"]
array([3])
>>> s[name == 'a',sub == "a3"]+5
array([8])
函数和矩阵运算:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将考试成绩转换成整数形式的十分制分数:

>>> npy.floor(s/10)
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 2.],
       [2., 2., 2., 2., 2., 2., 2., 2., 2., 3.]])

在这里插入图片描述
使用subtract 为数组中的每一个元素减去3分

>>> npy.subtract(s,3)
array([[-2, -1,  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]])
当然sbtract 函数肯定也是使用了广播机制的 将3转换成数组

  聚集函数:

在这里插入图片描述
对于二维数组对象可以指定在行操作或者列操作当参数axis为0时函数操作对象在同列不同行的数组元素,当axis参数为1 时是同行不同列的数组元素。

s.sum=(axis = 0 )#按列求和
s[name == 'a2'].mean() # 求平均分
name[scores[; sub == 'a3'].argmax()]#求a3这个学科的 列的最高分


在这里插入图片描述


版权声明:本文为qq_43541507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。