1. 程式人生 > >python 刪除多行陣列元素

python 刪除多行陣列元素

筆者在專案過程中需要刪除連續的多行陣列,查了好多資料,發現python只能一行一行的刪除,如果刪除連續的多行的話,由於其中指標的變化,會出現後面陣列的指標越界的現象,為此,將資料進行整合,以及給出自己的程式碼

首先先給出刪除多個元素的時候會出現越界現象的原因,這一部分來自yongh701的http://blog.csdn.net/yongh701/article/details/47166951

如下的一段小程式,

  1. #-*-coding:utf-8-*-
  2. arr=[1,2,3];  
  3. for a in arr:  
  4.     if a<3:  
  5.         arr.remove(a);  
  6. print arr;  

我本來想用陣列中自動封裝好的remove()方法,刪除陣列arr中少於3的元素。

這個方法刪除陣列中單個元素是沒有任何問題,但是如果想刪除arr中,少於3的元素問題就來的。

arr中有三個元素,1,2,3,少於3的元素有2個,刪除之後很顯然只是剩下[3],我開始也是這樣認為,但是執行結果卻是[2,3],如下圖所示:


原因是這樣的:


remove()在刪除陣列單個元素的時候,刪完元素很明顯需要把指標位置向前移1位,這就發生如上圖所示的指標偏移。

因此需要刪除陣列中多個元素的時候,絕對不能向上面那樣寫。

為此,可以用如下的方式結局,進行陣列中多個元素刪除的時候,先把這個陣列複製一個,刪的時候,遍歷臨時陣列,刪元陣列的元素,刪完再刪除臨時陣列,這就不會發生因刪除而導致的指標偏移了。具體程式碼如下:

  1. #-*-coding:utf-8-*-
  2. arr=[1,2,3];  
  3. arr_temp=arr[:]#直接建立一個新的陣列arr_temp並將arr的元素倒進來,arr_temp=arr的話,arr_temp僅僅是一個指向arr陣列的指標而已。
  4. for a in arr_temp:  
  5.     if a<3:  
  6.         arr.remove(a);  
  7. del arr_temp;  
  8. print arr;  

執行結果自然也符合我們所想象的一樣,最後在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)

倒序操作的前提是,你要確保裡面的數字是由小到大排序的。

歡迎轉載


相關推薦

python 刪除陣列元素

筆者在專案過程中需要刪除連續的多行陣列,查了好多資料,發現python只能一行一行的刪除,如果刪除連續的多行的話,由於其中指標的變化,會出現後面陣列的指標越界的現象,為此,將資料進行整合,以及給出自己的程式碼 首先先給出刪除多個元素的時候會出現越界現象的原因,這一部分來自y

Python列表一次刪除個重複元素

(1)刪除列表中所有'a': l = [0,1,'a',2,'a','a',3,4] l = [x for x in l if x != 'a'] print(l) >>[0,1,2,3,4] (2)刪除列表中所有'a'和‘b’: delete_list = ['a','b'

numpy tricks(二)—— 刪除陣列或列

numpy 下的多維陣列,如果要刪除其中的某些行,或某些列,不可以用置空的方式,進行設定; A[1, :] = None, ⇒ 會將 A 中的第一行資料全部置為 Nan 1. 使用切片(slice) 比如刪除第一行: B = A[1:, :]

python刪除數組中元素

python == amba none class 元素 mark down 要求 有數組a,要求去掉a所有為0的元素 a = [2,4,0,8,9,10,100,0,9,7] Filter a= filter(None, a) Lambada a = filter(la

InnoDB引擎,從大表中刪除

int ota man erro delete mysql 最小 following 可能 官方建議: InnoDB Tables If you are deleting many rows from a large table, you may exceed the l

MyBatis刪除以及引數的傳遞

測試程式碼     @Test     public void deleteBookByIds(){         /*List<Long> ids = new

Python陣列第n維的前幾位

現在我們有一個shape為(7352, 9, 128, 1)的numpy陣列。 想要取出第2維的前三個資料,構成新陣列(7352, 3, 128, 1) 我的思想是:將第2維資料轉置(transpose)到第一維,再用切片(slice)取出前三個資料,再轉置回去: print("#

python陣列操作

建立一個二維陣列, #建立一個寬度為3,高度為4的陣列 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] mylist = [[0] * 3] * 4 但是操作mylist[0][1] = 1的時候 發現整個第二列都被賦值為1 [

python之numpy.power()陣列元素求n次方

numpy.power(x1, x2) 陣列的元素分別求n次方。x2可以是數字,也可以是陣列,但是x1和x2的列數要相同。 >>> x1 = range(6) >>> x1 [0, 1, 2, 3, 4, 5] >>&g

Python-Numpy陣列 -- 算數運算, 統計函式

一、Numpy - 算數運算 1.用於執行算術運算(如add(),subtract(),multiply()和divide())的輸入陣列必須具有相同的形狀或符合陣列廣播規則。 demo import numpy as np a = np.arange(9, dtype = np

Python-Numpy陣列--位操作, 字串函式, 算術函式

一.位操作 1.bitwise_and 通過np.bitwise_and()函式對輸入陣列中的整數的二進位制表示的相應位執行位與運算。 例子 import numpy as np print '13 和 17 的二進位制形式:' a,b = 13,17 print bin(a), b

Python-Numpy陣列--陣列操作

1.修改形狀 序號 形狀及描述 1. reshape 不改變資料的條件下修改形狀 2. flat 陣列上的一維迭代器 3.

Python-Numpy陣列--廣播

一、Numpy - 廣播 術語廣播是指 NumPy 在算術運算期間處理不同形狀的陣列的能力。 對陣列的算術運算通常在相應的元素上進行。 如果兩個陣列具有完全相同的形狀,則這些操作被無縫執行。 DEMO 1 import numpy as np a = np.array([1,2,3,4]

Python-Numpy陣列--切片,索引,高階索引,布林索引

一、Numpy 切片和索引 ndarray物件的內容可以通過索引或切片來訪問和修改,就像 Python 的內建容器物件一樣。 如前所述,ndarray物件中的元素遵循基於零的索引。 有三種可用的索引方法型別: 欄位訪問,基本切片和高階索引。 基本切片是 Python

Python-Numpy陣列--來自現有資料的資料,來自數值範圍的資料

一、NumPy 來自現有資料的陣列 1.numpy.asarray此函式類似於numpy.array,除了它有較少的引數。 這個例程對於將 Python 序列轉換為ndarray非常有用。 numpy.asarray(a, dtype = None, order = None) 構造器接

Python-Numpy陣列--概述,資料型別物件,陣列的屬性,陣列的建立流程

一、Numpy概述          Numpy 是一個 Python 包(Numeric Python)。它是一個由多維陣列物件和用於處理陣列的集合組成的庫。 Numpy 擁有線性代數和隨機數生成的內建函式。Numpy 通常與 Sci

numpy教程:numpy基本資料型別及陣列元素存取

NumPy介紹Numpy(讀作num-pie)是Python中的一個矩陣計算包,功能類似於MATLAB的矩陣計算。標準安裝的Python中用列表(list)儲存一組值,可以用來當作陣列使用,不過由於列表的元素可以是任何物件,因此列表中所儲存的是物件的指標。這樣為了儲存一個簡單

python處理鍵盤輸入

根據牛客網的說法:https://www.nowcoder.com/discuss/276 import sys try: while True: line1 = sys.stdin.readline().strip() if line1 ==

vim刪除註釋與新增多註釋

刪除多行註釋 按 Esc 進入命令列模式,按下Ctrl + v, 進入列模式 選定將要取消註釋的多行 按 “d” 即可 新增多行註釋 首先按Esc進入命令列模式下,按下 Ctrl + v

vim 複製、刪除

一、多行 dd 刪除一行 ndd 刪除以當前行開始的n行 dw 刪除以當前字元開始的一個字元 ndw 刪除以當前字元開始的n個字元 d$、D 刪除以當前字元開始的一行字元 d) 刪除到下一句的開始 d} 刪除到下一段的開始 d回車 刪除2行二、複製多行 任務:將第9行至第15行的資料,複製到第16行方法1: