日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中str、list、numpy分片操作

發布時間:2025/3/20 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中str、list、numpy分片操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Python里,像字符串(str)、列表(list)、元組(tupple)和這類序列類型都支持切片操作

對對象切片,s是一個字符串,可以通過類似數組索引的方式獲取字符串中的字符,同時也可以用s[a🅱?c]的形式對s在a和b之間,以c為間隔取值,c的值還可以為負,負值則意味著反向取值

>>> s = 'bicycle' >>> s[0] 'b' >>> s[1] 'i' >>> s[::3] 'bye' >>> s[::-1] 'elcycib' >>> s[::-2] 'eccb'

給切片賦值

首先,生成一個長度為16,從0到15的列表

>>> l = list(range(16)) >>> l [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

用[20,30]將取代索引[2,5)的值

>>> l[2:5] = [20, 30] >>> l [0, 1, 20, 30, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

索引[5,8)將被刪除

>>> del l[5:8] >>> l [0, 1, 20, 30, 5, 9, 10, 11, 12, 13, 14, 15]

從數組第9個索引開始,以兩個單位為間隔,將[11,22]賦值給左邊的分片對象,如果賦值數組中元素的個數和分片對象中元素的個數不同,則會報錯

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> l[9::2] [13, 15] >>> l[9::2] = [11, 22] >>> l [0, 1, 20, 30, 5, 9, 10, 11, 12, 11, 14, 22] >>> l[6::2] [10, 12, 14] >>> l[6::2] = [66, 77, 88] # 同理,l[6::2]必須為[n1,n2,n3]的數組,如果不是則將其 賦值為[66, 77, 88]則會報錯 >>> l [0, 1, 20, 30, 5, 9, 66, 11, 77, 11, 88, 22]

列表l[2:5]的結果是[20, 30, 5],而我們的賦值是[30, 33],所以30會代替20,33會代替30,而5則會被去除。如果左邊數組元素的個數少于賦值數組中元素的個數,則原數組分片之后的元素會排在新元素之后

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> l[2:5] [20, 30, 5] >>> l[2:5] = [30, 33] >>> l [0, 1, 30, 33, 9, 66, 11, 77, 11, 88, 22] >>> l[2:5] [30, 33, 9] >>> l[2:5] = [-10, -20, -30, -40, -50] >>> l [0, 1, -10, -20, -30, -40, -50, 66, 11, 77, 11, 88, 22]

拷貝一個分片對象,并修改其中的值,并不會修改原列表對象中的值

>>> l1 = l[2:5] >>> l1 [-10, -20, -30] >>> l1 = [10, 20, 30] >>> l1 [10, 20, 30] >>> l [0, 1, -10, -20, -30, -40, -50, 66, 11, 77, 11, 88, 22]

如果將一個數字賦值給左邊的分片對象,則會報錯

>>> l[2:5] = 10 Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: can only assign an iterable  

numpy基本的索引和切片

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> import numpy as np >>> arr = np.arange(10) >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr[5] 5 >>> arr[5:8] array([5, 6, 7]) >>> arr[5:8] = 12 # 這里不會像之前會報錯 >>> arr array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])

如上所示,當你將一個標量賦值給一個切片對象時(如arr[5:8] = 12),該值會自動傳播到整個選區。跟之前列表的分片的區別在于,numpy數組分片是原始數組的視圖,數據沒有被復制,視圖上任何的修改都會直接反映到源數據上,如果不希望修改到源數據,則用arr[5:8].copy():

>>> arr_slice = arr[5:8] >>> arr_slice array([12, 12, 12]) >>> arr_slice[1] = 99 >>> arr_slice array([12, 99, 12]) >>> arr array([ 0, 1, 2, 3, 4, 12, 99, 12, 8, 9]) >>> arr_slice[:] = 66 >>> arr array([ 0, 1, 2, 3, 4, 66, 66, 66, 8, 9]) >>> arr_slice_copy = arr[5:8].copy() >>> arr_slice_copy array([66, 66, 66]) >>> arr_slice_copy[:] = 88 >>> arr_slice_copy array([88, 88, 88]) >>> arr array([ 0, 1, 2, 3, 4, 66, 66, 66, 8, 9])

在一個二維數組中,各索引位置上的元素不再是標量而是一維數組:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) >>> arr2d[2] array([7, 8, 9]) >>> arr2d[0][2] 3 >>> arr2d[0, 2] 3

按照行或者列來進行分片

>>> arr2d array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) >>> arr2d[:2] # 取前兩行,即第0行和第1行 array([[1, 2, 3],[4, 5, 6]]) >>> arr2d[:2, 1:] # 取前兩行的第零列之后所有元素 array([[2, 3],[5, 6]]) >>> arr2d[:, 1:2] # 取所有行的第一列元素(列索引從0開始) array([[2],[5],[8]]) >>> arr2d[1, :2] # 取第一行的前兩列的元素元素 array([4, 5]) >>> arr2d[2, :1] # 取第二行的第零列元素 array([7]) >>> arr2d[:, :1] # 取所有行的第零列元素 array([[1],[4],[7]]) >>> arr2d[:, 1:] = 0 # 同樣,分片表達式的賦值操作也會擴散到源數據 >>> arr2d array([[1, 0, 0],[4, 0, 0],[7, 0, 0]])

布爾型索引

假設我們有一個用于存儲數據的數組以及一個存儲姓名的數組(含有重復項)。

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> import numpy as np >>> from numpy.random import randint >>> names = np.array(['Bob', 'Joe', 'Bob', 'Will', 'Will', 'Joe', 'Joe', 'Bob']) >>> data = randint(6, size=(8, 4)) >>> data array([[2, 1, 2, 2],[3, 3, 4, 2],[0, 5, 3, 5],[2, 1, 5, 2],[1, 3, 0, 3],[0, 0, 0, 1],[0, 0, 0, 5],[4, 2, 5, 1]])

假設每個名字都對應data數組中的一行,而我們想要選出對應于名字“Bob”的所有行。我們可以這樣操作

>>> names == 'Bob' array([ True, False, True, False, False, False, False, True], dtype=bool) >>> data[names == 'Bob'] array([[2, 1, 2, 2],[0, 5, 3, 5],[4, 2, 5, 1]])

布爾型數組的長度必須跟被索引的數組長度一致,此外,還可以將布爾型數組跟分片、整數(或整數序列)混合使用

>>> data[names == 'Bob', 2:] array([[2, 2],[3, 5],[5, 1]]) >>> data[names == 'Bob', 3] array([2, 5, 1]) >>> data[names == 'Bob', 3:] array([[2],[5],[1]])

如果需要選取多個名字組合需要組合多個布爾條件,使用&(和)、|(或)之類的布爾算術運算符即可:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> mask = (names == 'Bob') | (names == 'Will') >>> mask array([ True, False, True, True, True, False, False, True], dtype=bool) >>> data[mask] array([[2, 1, 2, 2],[0, 5, 3, 5],[2, 1, 5, 2],[1, 3, 0, 3],[4, 2, 5, 1]])

注意:Python關鍵字and和or在布爾型數據中無效

通過布爾型數組設置值是一種經常用到的手段,為了將data中所有的偶數設置為3,我們只需:

>>> data array([[2, 1, 2, 2],[3, 3, 4, 2],[0, 5, 3, 5],[2, 1, 5, 2],[1, 3, 0, 3],[0, 0, 0, 1],[0, 0, 0, 5],[4, 2, 5, 1]]) >>> data[data % 2 == 0] = 3 >>> data array([[3, 1, 3, 3],[3, 3, 3, 3],[3, 5, 3, 5],[3, 1, 5, 3],[1, 3, 3, 3],[3, 3, 3, 1],[3, 3, 3, 5],[3, 3, 5, 1]])

花式索引

花式索引是numpy術語,它指的是利用整數數組進行索引。假設我們有一個8×4數組:

>>> arr = np.empty((8, 4)) >>> for i in range(8): ... arr[i] = i ... >>> arr array([[ 0., 0., 0., 0.],[ 1., 1., 1., 1.],[ 2., 2., 2., 2.],[ 3., 3., 3., 3.],[ 4., 4., 4., 4.],[ 5., 5., 5., 5.],[ 6., 6., 6., 6.],[ 7., 7., 7., 7.]]) >>> arr[[3, 5, 0, 6]] array([[ 3., 3., 3., 3.],[ 5., 5., 5., 5.],[ 0., 0., 0., 0.],[ 6., 6., 6., 6.]]) >>> arr[[3, -3, -1]] array([[ 3., 3., 3., 3.],[ 5., 5., 5., 5.],[ 7., 7., 7., 7.]])

arr[[3, 5, 0, 6]]會索引源數組的第三行、第五行、第零行、第六行,然后組成新的視圖返回,而arr[[3, -3, -1]]則會索引第三行、倒數第三行和倒數第一行

我們生成了一個8×4數組,然后傳入兩個索引數組[1, 5, 7, 2]、 [0, 3, 1, 2],然后我們得到一個一維的數組

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> arr = np.arange(32).reshape((8, 4)) >>> arr array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23],[24, 25, 26, 27],[28, 29, 30, 31]]) >>> arr[[1, 5, 7, 2], [0, 3, 1, 2]] array([ 4, 23, 29, 10])

下面我們分析一下上面的代碼究竟發生了什么,第一個索引數組[1, 5, 7, 2],我們獲取第一行、第五行、第七行和第二行,然后我們將根據第二個索引數組 [0, 3, 1, 2],獲取第一行的第零列、第五行的三列……以此類推,最后,我們獲得了一個一維的數組

當然,在有些情況下,我們希望按照不同的順序獲取源數組不同的行,并且還要在獲取后,改動原來的列順序,于是我們可以這樣做:

>>> arr[[1, 5, 7, 2]] array([[ 4, 5, 6, 7],[20, 21, 22, 23],[28, 29, 30, 31],[ 8, 9, 10, 11]]) >>> arr[[1, 5, 7, 2]][:, [2, 1, 3, 0]] array([[ 6, 5, 7, 4],[22, 21, 23, 20],[30, 29, 31, 28],[10, 9, 11, 8]]) >>> arr[np.ix_([1, 5, 7, 2], [2, 1, 3, 0])] array([[ 6, 5, 7, 4],[22, 21, 23, 20],[30, 29, 31, 28],[10, 9, 11, 8]])

如上,我們既可以用arr[[1, 5, 7, 2]][:, [2, 1, 3, 0]]這樣的方式獲取獲取不同的行,再改變其中的列順序,同時也可以用np.ix_函數達到一樣的目的,不過需要注意的一點是,花式索引跟分片不一樣,它總是將數據復制到新的數組中:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:579817333 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> arr1 = arr[np.ix_([1, 5, 7, 2], [2, 1, 3, 0])] >>> arr1 array([[ 6, 5, 7, 4],[22, 21, 23, 20],[30, 29, 31, 28],[10, 9, 11, 8]]) >>> arr1[1] = 66 >>> arr1 array([[ 6, 5, 7, 4],[66, 66, 66, 66],[30, 29, 31, 28],[10, 9, 11, 8]]) >>> arr array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23],[24, 25, 26, 27],[28, 29, 30, 31]])

總結

以上是生活随笔為你收集整理的Python中str、list、numpy分片操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。