Numpy基础20问

Numpy基础20问,第1张

一言以蔽之,numpy是python中基于数组对象的科学计算库。

提炼关键字,可以得出numpy以下三大特点:

因为numpy是一个python库,所以使用python包管理工具pip或者conda都可以安装。

安装python后,打开cmd命令行,输入:

即可完成安装。

n维数组(ndarray)对象,是一系列 同类数据 的集合,可以进行索引、切片、迭代 *** 作。

numpy中可以使用 array 函数创建数组:

判断一个数组是几维,主要是看它有几个轴(axis)。

一个轴表示一维数组,两个轴表示二维数组,以此类推。

每个轴都代表一个一维数组。

比如说,二维数组第一个轴里的每个元素都是一个一维数组,也就是第二个轴。

一维数组一个轴:

二维数组两个轴:

三维数组三个轴:

以此类推n维数组。

numpy中常用 array 函数创建数组,传入列表或元组即可。

创建一维数组,并指定数组类型为 int :

创建二维数组:

还可以使用 arange 函数创建一维数字数组,用法类似python的 range 函数

numpy的 random 模块用来创建随机数组。

random模块还有其他函数,这里不多说。

前面说到,数组维度即代表轴的数量。

我们可以通过数组(adarray)对象的ndim或shape属性,来查看轴的数量。

数组(ndarray)对象的 size 属性可以查看数组包含元素总数。

还可以通过 shape 属性返回元素的乘积,来计算数组元素数量。

Numpy支持的数据类型非常多,所以很适合做数值计算。

下面给出常见的数据类型:

数组(adarrry)对象提供 dtype 属性,用来查看数组类型。

前面说过,数组的 shape 属性返回一个元组,能够反映数组的形状,包括维度以及每个轴的元素数量。

那么如果给定一个数组,怎么改变其形状呢?

常用的方式有两种:

比如说我要将一个二维数组转换为三维数组。

reshape 方法可以传入整数或者元组形式的参数。

传入的参数和 shape 属性返回的元组的含义是一样的。

例如, x2reshape(1,2,3) 是将二维数组转换成三维数组,参数个数代表要转换的维度,参数数字从左到右分别表示0轴、1轴、2轴的元素数量。

resize 方法和 reshape 方法使用形式一样,区别是 resize 方法改变了原始数组形状。

numpy一维数组的索引和切片 *** 作类似python列表,这里不多讲。

比如说取一维数组前三个元素。

重点是对多维数组的索引和切片。

多维数组有多个轴,那么就需要对每个轴进行索引。

例如,三维数组形状为(x,y,z),分别代表:0轴有x个元素、1轴有y个元素,2轴有z个元素。

对0、1、2轴进行索引,如果取o轴第2个元素、1轴第0个元素、2轴第3个元素,那么索引形式就为[2,0,3]。

切片也是同样道理。

如果取o轴前2个元素、1轴前1个元素、2轴后2个元素,那么切片形式就为[:2,:1,-2:]。

说到迭代,大家很容易想到直接对数组直接使用 for 循环 *** 作,对于一维数组来说,当然是可以的。

但对于多维数组,迭代是相对于0轴完成的,就是多维数组最外层的那一维。

你没有办法直接遍历数组里每一个元素,嵌套循环又太低效。

这个时候就需要用到 flat 方法,它可以将多维数组平铺为一维的迭代器。

数组(ndarray)对象提供了ravel方法,用来将多维数组展开为一维数组。

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对多个数组的算术运算通常在相应的元素上进行。

较小的数组在较大的数组上“广播”,以便它们具有兼容的形状。

比如说一个一维数组乘以一个数字,相当于一维数组里每个元素都乘以这个数。

如果相同维度的数组进行运算,其shape相同,那么广播就是两个数组相同位数的元素进行运算。

如果两个数组维度不同,进行运算,这里就触发了广播的两个规则。

这两个规则保证了不同维度数组进行运算时,其维度自动调整成一致。

numpy提供了 transpose 函数用以对数组进行维度的调换,也就是转置 *** 作。

转置后返回一个新数组。

当然,可以用更简单的方法。

数组对象提供了 T 方法,用于转置,同样会返回一个新数组。

numpy的 concatenate 函数用于沿指定轴连接相同形状的两个或多个数组。

numpy的 unique 函数用于去除数组中的重复元素,返回一个新数组。

unique 函数还能返回重复元素的索引、计数等信息,可去查文档自定义参数。

numpy文档

菜鸟教程

foreach遍历数组的好是可以不知道数组的长度从而读出数组的key,name出来了,在php的foreach中有两种方法,arr_name as $value 和arr_name as $key => $value了

NumPy的排序方法有直接排序和间接排序。直接排序是对数据直接进行排序,间接排序是指根据一个或多个键值对数据集进行排序。直接排序使用 sort()函数,间接排序使用 argsort函数和lexsort函数。

sort函数是常用的排序方法,函数调用改变原始数组,无返回值。

格式:numpysort(a, axis, kind, order)

参数:

a : 要排序的数组

axis: 使得sort函数可以沿着指定轴对数据集进行排序。axis=1 为沿横轴排序,axis=0为沿纵轴排序,axis=None将数组平坦化后进行排序。

kind: 排序算法,默认 quicksort

order: 如果数组包含字段,则是要排序的字段

a = nparray([7, 9, 5, 2, 9, 4, 3, 1, 4, 3])

print('原数组:', a)

asort()

print("排序后: ", a)

输出:

原数组: [7 9 5 2 9 4 3 1 4 3]

排序后:  [1 2 3 3 4 4 5 7 9 9]

带参数轴的排序

a = nparray([[4, 2, 9, 5], [6, 4, 8, 3], [1, 6, 2, 4]])

print("原数组:", a)

asort(axis=1)

print("排序后: ", a)

输出:

原数组: [[4 2 9 5]

[6 4 8 3]

[1 6 2 4]]

排序后:  [[2 4 5 9]

[3 4 6 8]

[1 2 4 6]]

使用argsort, lexsort函数,可以在给定一个或多个键时,得到一个由整数构成的索引数组,索引值表示数据在新序列中的位置。

a = nparray([7, 9, 5, 2, 8, 4, 3, 1, 4, 3])

print("原数组:", a)

print("排序后: ", aargsort())

# 返回数组下标排序

print('显示较大的5个数:', a[aargsort()][-5:])

输出:

原数组: [7 9 5 2 8 4 3 1 4 3]

排序后:  [7 3 6 9 5 8 2 0 4 1]

显示较大的5个数: [4 5 7 8 9]

a = [1, 5, 7, 2, 3, -2, 4]

b = [9, 5, 2, 0, 6, 8, 7]

ind = nplexsort((b, a))

print('ind', ind)

tmp = [(a[i], b[i])for iin ind]

print('tmp', tmp)

输出:

ind [5 0 3 4 6 1 2]

tmp [(-2, 8), (1, 9), (2, 0), (3, 6), (4, 7), (5, 5), (7, 2)]

在统计分析中,需要提前将重复数据剔除。可以使用unique函数找到数组中唯一值并返回已排序的结果。参数return_counts设置为True时,可返回每个取值出现的次数。

数组内数据去重

names = nparray(['红色', '蓝色', '蓝色', '白色', '红色', '红色', '蓝色'])

print('原数组:', names)

print('去重后的数组:', npunique(names))

print('数据出现次数:', npunique(names, return_counts=True))

输出:

原数组: ['红色' '蓝色' '蓝色' '白色' '红色' '红色' '蓝色']

去重后的数组: ['白色' '红色' '蓝色']

数据出现次数: (array(['白色', '红色', '蓝色'], dtype='<U2'), array([1, 3, 3], dtype=int64))

统计分析时需要把一个数据重复若干次,在NumPy中主要使用tile, repeat函数实现重复数据

numpytile(A, reps)

a = nparange(5)

print('原数组:', a)

w = nptile(a, 3)

print("重复数据:", w)

输出:

原数组: [0 1 2 3 4]

重复数据: [0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]

numpyrepeat(a, reps, axis=None)

参数:a 是需要重复的数组元素,reps是重复次数, axis只沿着那个轴进行,0 按进行元素重复, 1表按列元素进行重复

a = nparange(5)

print('原数组:', a)

w = nptile(a, 3)

print('重复数据处理:\n', w)

a2 = nparray([[1, 2, 3], [4, 5, 6]])

print('重复数据处理1:\n', a2repeat(2, axis=0))

print('重复数据处理2:\n', a2repeat(2, axis=1))

输出:

原数组: [0 1 2 3 4]

重复数据处理:

[0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]

重复数据处理1:

[[1 2 3]

[1 2 3]

[4 5 6]

[4 5 6]]

重复数据处理2:

[[1 1 2 2 3 3]

[4 4 5 5 6 6]]

常见有sum, mean, std, var, min, max, 几乎所有的统计函数在针对2维数组时需要注意轴的概念。

axis参数0时,表示沿纵轴,1表示沿横轴

a = nparange(20)reshape(4, 5)

print('创建的数组:\n', a)

print('数组的和:', npsum(a))

print('数组纵轴的和: ', npsum(a, axis=0))

print('数组横轴的和: ', npsum(a, axis=1))

print('数组的均值: ', npmean(a))

print('数组纵轴的均值: ', npmean(a, axis=0))

print('数组横轴的均值 ', npmean(a, axis=1))

print('数组的标准差: ', npstd(a))

print('数组纵轴的标准差: ', npstd(a, axis=0))

print('数组横轴的标准差: ', npstd(a, axis=1))

输出:

创建的数组:

[[ 0  1  2  3  4]

[ 5  6  7  8  9]

[10 11 12 13 14]

[15 16 17 18 19]]

数组的和: 190

数组纵轴的和:  [30 34 38 42 46]

数组横轴的和:  [10 35 60 85]

数组的均值:  95

数组纵轴的均值:  [ 75  85  95 105 115]

数组横轴的均值  [ 2  7 12 17]

数组的标准差:  5766281297335398

数组纵轴的标准差:  [559016994 559016994 559016994 559016994 559016994]

数组横轴的标准差:  [141421356 141421356 141421356 141421356]

NumPy的基础主要包含数组及其索引,数组运算,数组读写以及常用的统计与分析方法。

数组的维度就是一个数组中的某个元素,当用数组下标表示的时候,需要用几个数字来表示才能唯一确定这个元素,这个数组就是几维。numpy中直接用 即可表示数与向量的乘法,参考python 27的一个例子:inport numpy as np  a = nparray([1,2,3,4]) # 向量   b = 5 # 数   print ab    ++++++++++++  [5,10,15,20]

NumPy数组的下标从0开始。 

同一个NumPy数组中所有元素的类型必须是相同的。

在详细介绍NumPy数组之前。先详细介绍下NumPy数组的基本属性。NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量。

比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是NumPy中的轴(axes),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

if(Alength > 0){

int index = 0;

int a = A[0];

for(int i=0; i<Alength; i++){

if(A[i] > a){

a = A[i];

index = i;

}

}

Systemoutprintln("数组中最大值是"+a+",下标是"+index);

}

以上就是关于Numpy基础20问全部的内容,包括:Numpy基础20问、numpy 能不能用数组索引获取二维数组中的单个元素呢、NumPy 中的数据统计分析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9558467.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存