numpy数组提示超出索引,但单独计算时没有问题

numpy数组提示超出索引,但单独计算时没有问题,第1张

限制索引取值范围(0到 (数组长度-1)),或者增加数组的长度

数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,以此类推。

数组是通过下表进行访问,但超出下标(索引)最大值(数组长度-1)就会访问超出界限

如:int [] arr= new int[2];;

arr[0]=1;

arr[1]=2;

--此数组长度为2,下标最大为1(数组下标从0开始)

--如果下标超出0-1这个范围就会出现索引超出界限问题。

--限制下标(索引)的取值范围,或者数组长度增加都可以防止索引超出界限

NumPy数组(1、数组初探)

更新

目前我的工作是将NumPy引入到Pyston中(一款Dropbox实现的Python编译器/解释器)。在工作过程中,我深入接触了NumPy源码,了解其实现并提交了PR修复NumPy的bug。在与NumPy源码以及NumPy开发者打交道的过程中,我发现当今中文NumPy教程大部分都是翻译或参考英文文档,因此导致了许多疏漏。比如NumPy数组中的broadcast功能,几乎所有中文文档都翻译为“广播”。而NumPy的开发者之一,回复到“broadcast is a compound -- native English speakers can see that it's " broad" + "cast" = "cast (scatter, distribute) broadly, I guess "cast (scatter, distribute) broadly" probably is closer to the meaning(NumPy中的含义)"。有鉴于此,我打算启动一个项目,以我对NumPy使用以及源码层面的了解编写一个系列的教程。

地址随后会更新。CSDN的排版(列表)怎么显示不正常了。。。

NumPy数组

NumPy数组是一个多维数组对象,称为ndarray。其由两部分组成:

实际的数据

描述这些数据的元数据

大部分 *** 作仅针对于元数据,而不改变底层实际的数据。

关于NumPy数组有几点必需了解的:

NumPy数组的下标从0开始。

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

NumPy数组属性

在详细介绍NumPy数组之前。先详细介绍下NumPy数组的基本属性。NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是NumPy中的轴(axes),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。

NumPy的数组中比较重要ndarray对象属性有:

ndarrayndim:数组的维数(即数组轴的个数),等于秩。最常见的为二维数组(矩阵)。

ndarrayshape:数组的维度。为一个表示数组在每个维度上大小的整数元组。例如二维数组中,表示数组的“行数”和“列数”。ndarrayshape返回一个元组,这个元组的长度就是维度的数目,即ndim属性。

ndarraysize:数组元素的总个数,等于shape属性中元组元素的乘积。

ndarraydtype:表示数组中元素类型的对象,可使用标准的Python类型创建或指定dtype。另外也可使用前一篇文章中介绍的NumPy提供的数据类型。

ndarrayitemsize:数组中每个元素的字节大小。例如,一个元素类型为float64的数组itemsiz属性值为8(float64占用64个bits,每个字节长度为8,所以64/8,占用8个字节),又如,一个元素类型为complex32的数组item属性为4(32/8)。

ndarraydata:包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

创建数组

先来介绍创建数组。创建数组的方法有很多。如可以使用array函数从常规的Python列表和元组创造数组。所创建的数组类型由原序列中的元素类型推导而来。 

1python自带数据结构:序列(如list)、映射(如字典)、集合(set)。

以下只介绍序列中的list:

创建list:

list1 = []

list1 = [1,2,3,4,5,6,7,8,9] #逗号隔开

list2 = [[1,2],[3,4],[5,6],[7,8]] #list2长度(len(list2))为2,list2[0] = [1,2]

liststring = list(“thisisalist”) #只用于创建字符串列表

索引list:

e = list1[0] #下标从零开始,用中括号

分片list:

es = list1[0:3]

es = list1[0:9:2] #步长在第二个冒号后

list拼接(list1append(obj)、加运算及乘运算):

list长度:

list每个元素乘一个数值:

list2 = numpydot(list2,2)

list类似矩阵相乘(每个元素对应相乘取和):

list3 = numpydot(list1,list1)

#要求相乘的两个list长度相同

list3 = numpydot(list2,list22)

#要求numpyshape(list2)和numpyshape(list22)满足“左行等于右列”的矩阵相乘条件,相乘结果numpyshape(list3)满足“左列右行”

2numpy数据结构:

Array:

产生array:

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

data=nparray(list1)

data1 = npzeros(5) #data1shape = (5,),5列

data1 = npeye(5)

索引array:

datacut = data[0,2] #取第零行第二列,此处是6

切片array:

datacut = data[0:2,2] # array([6, 5])

array长度:

datashape

datasize

npshape(data)

npsize(data)

len(data)

array拼接:

#括号内也有一个括号(中括号或者小括号)!

d = npconcatenate((data,data))

d = npconcatenate((data,data),axis = 1) #对应行拼接

array加法:逐个相加

array乘法:

d = data data #逐个相乘

d = npdot(data,data) #矩阵相乘

d = data 3 #每个元素乘3

d = npdot(data,3) #每个元素乘3

array矩阵运算:

取逆 : nplinalginv(data)

转置:dataT

所有元素求和 : npsum(data)

生成随机数:nprandomnormal(loc=0, scale=10, size=None)

生成标准正态分布随机数组:nprandomnormal(size=(4,4))

生成二维随机数组:

nprandommultivariate_normal([0,0],npeye(2))

生成范围在0到1之间的随机矩阵(M,N):

nprandomrandint(0,2,(M,N))

Matrix:

创建matrix:

mat1 = npmat([[1, 2, 3], [4, 5, 6]])

mat1 = npmat(list)

mat1 = npmat(data)

matrix是二维的,所有+,-,都是矩阵 *** 作。

matrix索引和分列:

mat1[0:2,1]

matrix转置:

nptranspose(mat1)

mat1transpose()

matrix拼接:

npconcatenate([mat1,mat1])

npconcatenate([mat1,mat1],axis = 1)

numpy数据结构总结:对于numpy中的数据结构的 *** 作方法基本相同:

创建:npmat(list),nparray(list)

矩阵乘:npdot(x,y)

转置:xT or nptranspose(x)

拼接:npconcatenate([x,y],axis = 1)

索引:mat[0:1,4],ary[0:1,4]

3pandas数据结构:

Series:

创建series:

s = pdSeries([[1,2,3],[4,5,6]],index = [‘a’,‘b’])

索引series:

s1 = s[‘b’]

拼接series:

pdconcat([s1,s1],axis = 1) #也可使用sappend(s)

DataFrame:

创建DaraFrame:

df = pdDataFrame([[1,2,3],[1,2,3]],index = ['a','b'],columns = ['x','y','z'])

df取某一列:

dfc1 =dfx

dfc1 = df[‘x’]

dfc2 = dfiloc[:,0] #用iloc方括号里是数字而不是column名!

dfc2 = dfiloc[:,0:3]

df取某一行:

dfr1 = dfiloc[0]

df1 = dfiloc[0:2]

df1 = df[0:2] #这种方法只能用于取一个区间

df取某个值:

dfc2 = dfiloc[0,0]

dfc2 = dfiloc[0:2,0:3]

在numpy的ndarray类型中,似乎没有直接返回特定索引的方法,我只找到了where函数,但是where函数对于寻找某个特定值对应的索引很有用,对于返回一定区间内值的索引不是很有效,至少我没有弄明白应该如何 *** 作。下面先说一下where函数的用法吧。

(1)where函数的使用场景:

例如现在我生成了一个数组:

import numpy as np

arr=nparray([1,1,1,134,45,3,46,45,65,3,23424,234,12,12,3,546,1,2])

现在arr是一个含有18个元素的ndarray类型的数组,后面就用数组来称呼它吧。假如我想返回数组中所有元素值为3所对应的索引位置,那么通过where函数可以很轻松地完成。

print npwhere(arr==3)

它会返回一个包含所有值为3对应的索引位置的元组,如下图:

可以看到在索引为5、9、14的地方所对应的元素值为3。通过这样的方式可以轻松达到目的。但是对于一定变化范围内的索引这样就不行了。下面的方法是自己想出来的折衷办法,比较笨,高手清喷。

(2)通过一个辅助的数组来解决一定范围内值索引的查找

我们建一个标识元素索引的数组,然后通过它来显示符合条件的元素对应的索引。还是刚才的数组,假如我现在要返回元素值在3到100之间值的索引。我可以生成一个和arr相同大小的数组,然后首先通过一次筛选找到大于3的元素对应索引的数组,继而在其中再次筛选,最终得到想要的结果。代码如下:

b=nparange(len(arr))#生成和arr相同长度的数组

c=b[arr>3]#c存放的就是arr中大于3的元素对应的索引

#最后通过遍历c数组,选择3到100之间的值打印出来

for i in range(len(c)):

if arr[c[i]]<100:

print c[i],

下面看一下执行的效果:

可以看到程序将所有介于3和100之间的元素对应的索引值打了出来,如果想同时获得索引值和相应的元素,只需将上面的“print c[i]”,  替换为 “print c[i],arr[c[i]]”即可。 当然这种方法也适用于选择某个特定值对应的索引,例如我想找到所有3对应的位置,可以用print b[arr==3]即可打印出所有值为3的元素所对应的索引。其实不论怎么做,都是用到了数组进行关系运算后生成布尔数组,然后让数组中为True的地方进行显示。

可以看到程序将所有介于3和100之间的元素对应的索引值打了出来,如果想同时获得索引值和相应的元素,只需将上面的“print c[i]”,  替换为 “print c[i],arr[c[i]]”即可。

当然这种方法也适用于选择某个特定值对应的索引,例如我想找到所有3对应的位置,可以用print b[arr==3]即可打印出所有值为3的元素所对应的索引。其实不论怎么做,都是用到了数组进行关系运算后生成布尔数组,然后让数组中为True的地方进行显示。

当然还可以通过两次进行筛选,分别筛选出大于3的元素和小于100的元素对应的索引数组,然后两个数组做交集处理,在numpy中有一个intersect1d函数可以进行这样的运算,但是仍然麻烦。目前只能想到这些办法,不知道有哪位高手有更好的方法,欢迎大家一起交流一下。

以上就是关于numpy数组提示超出索引,但单独计算时没有问题全部的内容,包括:numpy数组提示超出索引,但单独计算时没有问题、什么是数组的维度,python 的ndim的使用、python自带及pandas、numpy数据结构(一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/9285438.html

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

发表评论

登录后才能评论

评论列表(0条)

保存