笔者在项目过程中需要删除连续的多行数组,查了好多资料,发现python只能一行一行的删除,如果删除连续的多行的话,由于其中指针的变化,会出现后面数组的指标越界的现象,为此,将资料进行整合,以及给出自己的代码
首先先给出删除多个元素的时候会出现越界现象的原因,这一部分来自yongh701的http://blog.csdn.net/yongh701/article/details/47166951
如下的一段小程序,
我本来想用数组中自动封装好的remove()方法,删除数组arr中少于3的元素。
这个方法删除数组中单个元素是没有任何问题,但是如果想删除arr中,少于3的元素问题就来的。
arr中有三个元素,1,2,3,少于3的元素有2个,删除之后很显然只是剩下[3],我开始也是这样认为,但是运行结果却是[2,3],如下图所示:
原因是这样的:
remove()在删除数组单个元素的时候,删完元素很明显需要把指针位置向前移1位,这就发生如上图所示的指针偏移。
因此需要删除数组中多个元素的时候,绝对不能向上面那样写。
为此,可以用如下的方式结局,进行数组中多个元素删除的时候,先把这个数组复制一个,删的时候,遍历临时数组,删元数组的元素,删完再删除临时数组,这就不会发生因删除而导致的指针偏移了。具体代码如下:
运行结果自然也符合我们所想象的一样,最后在arr里面剩余3这个元素!
中间我又试了好多种方法,其中收获最大的是,我知道了python的深拷贝与浅拷贝,这个真的是太重要了,以后大家自己注意就好了,这块走的弯路就不记录了,给大家介绍一下python中的深拷贝和浅拷贝吧
引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些。下面举个例子:
问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制
a=[1,2]
b=a
这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象。这样,如果对a或b的元素进行修改,a,b的值同时发生变化。
解决的方法为:
a=[1,2]
b=a[:]
这样修改a对b没有影响。修改b对a没有影响。
但 这种方法只适用于简单列表,也就是列表中的元素都是基本类型,如果列表元素还存在列表的话,这种方法就不适用了。原因就是,象a[:]这种处理,只是将列 表元素的值生成一个新的列表,如果列表元素也是一个列表,如:a=[1,[2]],那么这种复制对于元素[2]的处理只是复制[2]的引用,而并未生成 [2]的一个新的列表复制。为了证明这一点,测试步骤如下:
>>> a=[1,[2]]
>>> b=a[:]
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2, 3]]
可见,对a的修改影响到了b。如果解决这一问题,可以使用copy模块中的deepcopy函数。修改测试如下:
>>> import copy
>>> a=[1,[2]]
>>> b=copy.deepcopy(a)
>>> b
[1, [2]]
>>> a[1].append(3)
>>> a
[1, [2, 3]]
>>> b
[1, [2]]
有时候知道这一点是非常重要的,因为可能你的确需要一个新的列表,并且对这个新的列表进行操作,同时不想影响原来的列表。
这部分的内容可一自行百度去学习深拷贝、浅拷贝以及引用的一些概念。
下面说一个我的小技巧来删除二维数组,那就是倒序删除,因为这样就不会影响指针的指向了,程序如下:
removeylen=len(removey)
removey.sort()
for x in range(removeylen)[::-1]:
for i in range(4*removey[x],4*removey[x]+4)[::-1]:
box1=np.delete(box1,i,0)
倒序操作的前提是,你要确保里面的数字是由小到大排序的。
欢迎转载