限制索引取值范围(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数据结构(一)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)