python 刪除多行陣列元素
筆者在專案過程中需要刪除連續的多行陣列,查了好多資料,發現python只能一行一行的刪除,如果刪除連續的多行的話,由於其中指標的變化,會出現後面陣列的指標越界的現象,為此,將資料進行整合,以及給出自己的程式碼
首先先給出刪除多個元素的時候會出現越界現象的原因,這一部分來自yongh701的http://blog.csdn.net/yongh701/article/details/47166951
如下的一段小程式,
- #-*-coding:utf-8-*-
- arr=[1,2,3];
- for a in arr:
- if a<3:
-
arr.remove(a);
- print arr;
我本來想用陣列中自動封裝好的remove()方法,刪除陣列arr中少於3的元素。
這個方法刪除陣列中單個元素是沒有任何問題,但是如果想刪除arr中,少於3的元素問題就來的。
arr中有三個元素,1,2,3,少於3的元素有2個,刪除之後很顯然只是剩下[3],我開始也是這樣認為,但是執行結果卻是[2,3],如下圖所示:
原因是這樣的:
remove()在刪除陣列單個元素的時候,刪完元素很明顯需要把指標位置向前移1位,這就發生如上圖所示的指標偏移。
因此需要刪除陣列中多個元素的時候,絕對不能向上面那樣寫。
為此,可以用如下的方式結局,進行陣列中多個元素刪除的時候,先把這個陣列複製一個,刪的時候,遍歷臨時陣列,刪元陣列的元素,刪完再刪除臨時陣列,這就不會發生因刪除而導致的指標偏移了。具體程式碼如下:
- #-*-coding:utf-8-*-
- arr=[1,2,3];
- arr_temp=arr[:]#直接建立一個新的陣列arr_temp並將arr的元素倒進來,arr_temp=arr的話,arr_temp僅僅是一個指向arr陣列的指標而已。
- for a in arr_temp:
- if a<3:
- arr.remove(a);
- del arr_temp;
- 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: