網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
楔子
在 TensorFlow 中,可以給一個(gè) tensor 增加一個(gè)維度、刪除一個(gè)維度,那么在 Numpy 中該怎么呢?
刪除維度、增加維度
先來(lái)看看如何增加一個(gè)維度:
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í)上第一個(gè)維度我們是不需要的,因?yàn)樵谠摼S度上數(shù)組的長(zhǎng)度是 1
# 刪除第 1 個(gè)維度,我們看到已經(jīng)改變了
print(np.squeeze(arr, 0))
"""
[[1 2 3]
[2 3 4]]
"""
但是注意:只有數(shù)組長(zhǎng)度在該維度上為 1,那么該維度才可以被刪除。如果不是1,那么刪除的話會(huì)報(bào)錯(cuò)。
import numpy as np
arr = np.array([[[1, 2, 3], [2, 3, 4]]])
print(arr.shape) # (1, 2, 3)
try:
# 刪除第二個(gè)維度,顯然在第二個(gè)維度上數(shù)組的長(zhǎng)度是 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ù)組長(zhǎng)度為 1 所對(duì)應(yīng)的維度,同理添加也是添加一個(gè)維度也只是讓數(shù)組在這個(gè)維度上的長(zhǎng)度變成 1,因?yàn)閿?shù)組本來(lái)不存在這個(gè)維度的,但是我們強(qiáng)行加上了一個(gè)維度,那么數(shù)組在這個(gè)維度上的長(zhǎng)度只能是 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í),數(shù)組在該維度上的長(zhǎng)度必須是 1。
另外,變化維度還可以使用 reshape,比如 arr 的維度是 (2, 1, 3),我們把第二個(gè)維度給去掉的話,那么直接 arr.reshape((2, 3)) 即可,增加維度也是同理,只要變化維度前后的元素個(gè)數(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
最后,增加維度還有一種做法,但用的不多,舉個(gè)栗子:
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 等價(jià)于 None
print(arr[:, None, :, None, None].shape) # (2, 1, 3, 1, 1)
# 使用 : 的部分和之前的維度是對(duì)應(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]]
"""
刪除、增加一行或一列
說(shuō)實(shí)話,改變數(shù)組的維度不是特別常見(jiàn),更常見(jiàn)的是刪除數(shù)組的一行或者一列,舉個(gè)栗子:
# 原始數(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]]
這種需求相對(duì)來(lái)說(shuō)更加常見(jiàn)一些,那么應(yīng)該怎么做呢?我們來(lái)看一下。
刪除一行或一列
首先是刪除:
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,那么會(huì) np.delete 會(huì)將傳遞的數(shù)組扁平化(變成一維數(shù)組),然后進(jìn)行刪除。舉個(gè)栗子:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""
[[1 2 3]
[4 5 6]]
"""
# 會(huì)將 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 是一個(gè)二維數(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,那么仍然會(huì)將傳遞的數(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]]
"""
# 或者我們也可以手動(dòng)指定
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]]
"""
# 插入一列,注意元素個(gè)數(shù)要匹配,每一列是 3 個(gè)元素
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),舉個(gè)栗子:
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 不指定維度,那么也是會(huì)先將數(shù)組扁平化,然后在進(jìn)行 insert,舉個(gè)栗子:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.insert(arr, 1, [0, 0])) # [1 0 0 2 3 4 5 6]
總的來(lái)說(shuō)還是比較簡(jiǎn)單的。
原文鏈接:https://www.cnblogs.com/traditional/p/12629050.html
- 上一篇:沒(méi)有了
- 下一篇:沒(méi)有了
相關(guān)推薦
- 2023-06-16 瞅一眼就能學(xué)會(huì)的GO并發(fā)編程使用教程_Golang
- 2022-03-14 @Builder 實(shí)際參數(shù)列表和形式參數(shù)列表長(zhǎng)度不同
- 2022-07-07 Python編寫運(yùn)維進(jìn)程文件目錄操作實(shí)用腳本示例_python
- 2023-03-22 tkinter動(dòng)態(tài)顯示時(shí)間的兩種實(shí)現(xiàn)方法_python
- 2022-04-12 一篇文章帶你了解python中的typing模塊和類型注解_python
- 2022-08-28 Python代碼中引用已經(jīng)寫好的模塊、方法的兩種方式_python
- 2022-08-23 Python中應(yīng)用Winsorize縮尾處理的操作經(jīng)驗(yàn)_python
- 2022-06-18 Android?Scroller實(shí)現(xiàn)彈性滑動(dòng)效果_Android
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支