numpy增加維度、刪除維度的方法
楔子
在 TensorFlow 中,可以給一個 tensor 增加一個維度、刪除一個維度,那么在 Numpy 中該怎么呢?
刪除維度、增加維度
先來看看如何增加一個維度:
import numpy as np arr = np.array([[[1, 2, 3], [2, 3, 4]]]) print(arr) """ [[[1 2 3] [2 3 4]]] """ print(arr.shape) # (1, 2, 3) # 事實(shí)上第一個維度我們是不需要的,因?yàn)樵谠摼S度上數(shù)組的長度是 1 # 刪除第 1 個維度,我們看到已經(jīng)改變了 print(np.squeeze(arr, 0)) """ [[1 2 3] [2 3 4]] """
但是注意:只有數(shù)組長度在該維度上為 1,那么該維度才可以被刪除。如果不是1,那么刪除的話會報錯。
import numpy as np arr = np.array([[[1, 2, 3], [2, 3, 4]]]) print(arr.shape) # (1, 2, 3) try: # 刪除第二個維度,顯然在第二個維度上數(shù)組的長度是 2,不是 1 # 所以它不能被刪除 print(np.squeeze(arr, 1)) except Exception as e: print(e) # cannot select an axis to squeeze out which has size not equal to one
刪除只能刪除數(shù)組長度為 1 所對應(yīng)的維度,同理添加也是添加一個維度也只是讓數(shù)組在這個維度上的長度變成 1,因?yàn)閿?shù)組本來不存在這個維度的,但是我們強(qiáng)行加上了一個維度,那么數(shù)組在這個維度上的長度只能是 1。
import numpy as np arr = np.array([[1, 2, 3], [2, 3, 4]]) print(arr.shape) # (2, 3) # 很好理解 print(np.expand_dims(arr, 0).shape) # (1, 2, 3) print(np.expand_dims(arr, 1).shape) # (2, 1, 3) print(np.expand_dims(arr, 2).shape) # (2, 3, 1) arr = np.array([1, 2, 3]) print(np.expand_dims(arr, 0)) """ [[1 2 3]] """ print(np.expand_dims(arr, 1)) """ [[1] [2] [3]] """
以上就實(shí)現(xiàn)了數(shù)組維度的刪除和增加,因?yàn)閿?shù)組的元素是固定的,所以在刪除維度和增加維度時,數(shù)組在該維度上的長度必須是 1。
另外,變化維度還可以使用 reshape,比如 arr 的維度是 (2, 1, 3),我們把第二個維度給去掉的話,那么直接 arr.reshape((2, 3)) 即可,增加維度也是同理,只要變化維度前后的元素個數(shù)不變即可。
import numpy as np arr = np.array([[1, 2, 3], [2, 3, 4]]) print(arr.shape) # (2, 3) arr1 = arr.reshape((2, 1, 1, 3)) print(arr1) """ [[[[1 2 3]]] [[[2 3 4]]]] """ print(arr1.shape) # (2, 1, 1, 3) print(np.all(arr1.reshape((2, 3)) == arr)) # True
最后,增加維度還有一種做法,但用的不多,舉個栗子:
import numpy as np arr = np.array([[1, 2, 3], [2, 3, 4]]) print(arr.shape) # (2, 3) # 將維度變成 (2, 1, 3, 1, 1) arr1 = arr[:, np.newaxis, :, np.newaxis, np.newaxis] print(arr1.shape) # (2, 1, 3, 1, 1) # np.newaxis 等價于 None print(arr[:, None, :, None, None].shape) # (2, 1, 3, 1, 1) # 使用 : 的部分和之前的維度是對應(yīng)的,np.newaxis 或者 None 可以理解成 1 # 因此最終得到的數(shù)組的維度就是 (2, 1, 3, 1, 1) # 再以一維數(shù)組為例 arr = np.array([1, 2, 3]) print(arr) """ [1 2 3] """ # 得到的數(shù)組的 shape 為 (1, 3) print(arr[None, :]) """ [[1 2 3]] """ # 得到的數(shù)組的 shape 為 (3, 1) print(arr[:, None]) """ [[1] [2] [3]] """
刪除、增加一行或一列
說實(shí)話,改變數(shù)組的維度不是特別常見,更常見的是刪除數(shù)組的一行或者一列,舉個栗子:
# 原始數(shù)組 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] # 我們希望刪除一行 [[ 0 1 2 3] [ 8 9 10 11]] # 或者刪除一列 [[ 0 2 3] [ 4 6 7] [ 8 10 11]]
這種需求相對來說更加常見一些,那么應(yīng)該怎么做呢?我們來看一下。
刪除一行或一列
首先是刪除:
import numpy as np arr = np.arange(0, 12).reshape(3, 4) print(arr) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] """ # 假設(shè)刪除第二行 print(np.delete(arr, [1], axis=0)) """ [[ 0 1 2 3] [ 8 9 10 11]] """ # 刪除第一行和第三行 print(np.delete(arr, [0, 2], axis=0)) """ [[4 5 6 7]] """ # 刪除前兩行,slice(0, 2) 也可以換成 np.s_[0: 2] print(np.delete(arr, slice(0, 2), axis=0)) """ [[ 8 9 10 11]] """
刪除列的話也是同理,只需要將 axis=0 換成 axis=1 即可,注意:如果不指定 axis 或者 axis 指定為 None,那么會 np.delete 會將傳遞的數(shù)組扁平化(變成一維數(shù)組),然后進(jìn)行刪除。舉個栗子:
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr) """ [[1 2 3] [4 5 6]] """ # 會將 arr 扁平化處理,然后刪除索引為 1 的元素,因此要注意 axis 參數(shù) print(np.delete(arr, [1])) """ [1 3 4 5 6] """
增加一行或一列
如果想增加一行或一列的話,要怎么做呢?
import numpy as np arr = np.arange(0, 12).reshape(3, 4) print(arr) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] """ # 在尾部增加一行,注意:這里的維度一定要匹配,指定 [0, 0, 0, 0] 是不行的,因?yàn)?arr 是一個二維數(shù)組 print(np.append(arr, [[0, 0, 0, 0]], axis=0)) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [ 0 0 0 0]] """ # 在尾部增加一列,維度同樣要匹配 print(np.append(arr, [[0], [0], [0]], axis=1)) """ [[ 0 1 2 3 0] [ 4 5 6 7 0] [ 8 9 10 11 0]] """
如果不指定 axis,那么仍然會將傳遞的數(shù)組扁平化,然后進(jìn)行追加:
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(arr) print(np.append(arr, 0)) # [1 2 3 4 5 6 0] print(np.append(arr, [0, 0])) # [1 2 3 4 5 6 0 0] print(np.append(arr, [[0, 0]])) # [1 2 3 4 5 6 0 0]
append 默認(rèn)是在尾部進(jìn)行追加,并且還要求維度要匹配,不是很方便。所以這里更推薦 insert 函數(shù):
import numpy as np arr = np.arange(0, 12).reshape(3, 4) print(arr) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] """ # 索引為 1 的位置插入一行,值全為 0 print(np.insert(arr, 1, 0, axis=0)) """ [[ 0 1 2 3] [ 0 0 0 0] [ 4 5 6 7] [ 8 9 10 11]] """ # 或者我們也可以手動指定 print(np.insert(arr, 1, [0, 0, 0, 0], axis=0)) """ [[ 0 1 2 3] [ 0 0 0 0] [ 4 5 6 7] [ 8 9 10 11]] """ # 二維數(shù)組也是可以的 print(np.insert(arr, 1, [[0, 0, 0, 0], [0, 0, 0, 0]], axis=0)) """ [[ 0 1 2 3] [ 0 0 0 0] [ 0 0 0 0] [ 4 5 6 7] [ 8 9 10 11]] """ # 插入一列,注意元素個數(shù)要匹配,每一列是 3 個元素 print(np.insert(arr, 1, [[0, 0, 0], [0, 0, 0]], axis=1)) """ [[ 0 0 0 1 2 3] [ 4 0 0 5 6 7] [ 8 0 0 9 10 11]] """
我們看到 insert 比 append 要方便很多,并且功能也更加強(qiáng)大一些,并且 append 完全可以使用 insert 實(shí)現(xiàn),舉個栗子:
import numpy as np arr = np.arange(0, 12).reshape(3, 4) print(arr) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] """ # 在尾部增加一行 print(np.insert(arr, arr.shape[0], 0, axis=0)) """ [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [ 0 0 0 0]] """ # 在尾部增加一列 print(np.insert(arr, arr.shape[1], 0, axis=1)) """ [[ 0 1 2 3 0] [ 4 5 6 7 0] [ 8 9 10 11 0]] """
最后,如果 insert 不指定維度,那么也是會先將數(shù)組扁平化,然后在進(jìn)行 insert,舉個栗子:
arr = np.array([[1, 2, 3], [4, 5, 6]]) print(np.insert(arr, 1, [0, 0])) # [1 0 0 2 3 4 5 6]
總的來說還是比較簡單的。
到此這篇關(guān)于numpy增加維度、刪除維度的方法的文章就介紹到這了,更多相關(guān)numpy增加維度、刪除維度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
tensorflow實(shí)現(xiàn)tensor中滿足某一條件的數(shù)值取出組成新的tensor
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)tensor中滿足某一條件的數(shù)值取出組成新的tensor,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python 創(chuàng)建子進(jìn)程模塊subprocess詳解
這篇文章主要介紹了Python 創(chuàng)建子進(jìn)程模塊subprocess詳解,本文詳細(xì)講解了subprocess模塊的方法、參數(shù)、使用實(shí)例等,需要的朋友可以參考下2015-04-04基于Python函數(shù)的作用域規(guī)則和閉包(詳解)
下面小編就為大家分享一篇基于Python函數(shù)的作用域規(guī)則和閉包詳解,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11利用Python實(shí)現(xiàn)文件讀取與輸入以及數(shù)據(jù)存儲與讀取的常用命令
這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)文件讀取與輸入以及數(shù)據(jù)存儲與讀取的常用命令,文中還介紹了用python循環(huán)保存文件并循環(huán)讀取文件的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11Python隨機(jī)生成一個6位的驗(yàn)證碼代碼分享
這篇文章主要介紹了Python隨機(jī)生成一個6位的驗(yàn)證碼代碼分享,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-03-03Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式)
這篇文章主要介紹了Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05