中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

numpy怎么增加維度和刪除維度

發布時間:2023-02-25 10:13:34 來源:億速云 閱讀:114 作者:iii 欄目:開發技術

這篇“numpy怎么增加維度和刪除維度”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“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)
# 事實上第一個維度我們是不需要的,因為在該維度上數組的長度是 1

# 刪除第 1 個維度,我們看到已經改變了
print(np.squeeze(arr, 0))
"""
[[1 2 3]
 [2 3 4]]
"""

但是注意:只有數組長度在該維度上為 1,那么該維度才可以被刪除。如果不是1,那么刪除的話會報錯。

import numpy as np
arr = np.array([[[1, 2, 3], [2, 3, 4]]])

print(arr.shape)  # (1, 2, 3)

try:
    # 刪除第二個維度,顯然在第二個維度上數組的長度是 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

刪除只能刪除數組長度為 1 所對應的維度,同理添加也是添加一個維度也只是讓數組在這個維度上的長度變成 1,因為數組本來不存在這個維度的,但是我們強行加上了一個維度,那么數組在這個維度上的長度只能是 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]]
"""

以上就實現了數組維度的刪除和增加,因為數組的元素是固定的,所以在刪除維度和增加維度時,數組在該維度上的長度必須是 1。

另外,變化維度還可以使用 reshape,比如 arr 的維度是 (2, 1, 3),我們把第二個維度給去掉的話,那么直接 arr.reshape((2, 3)) 即可,增加維度也是同理,只要變化維度前后的元素個數不變即可。

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)
# 使用 : 的部分和之前的維度是對應的,np.newaxis 或者 None 可以理解成 1
# 因此最終得到的數組的維度就是 (2, 1, 3, 1, 1)

# 再以一維數組為例
arr = np.array([1, 2, 3])
print(arr)
"""
[1 2 3]
"""
# 得到的數組的 shape 為 (1, 3)
print(arr[None, :])
"""
[[1 2 3]]
"""
# 得到的數組的 shape 為 (3, 1)
print(arr[:, None])
"""
[[1]
 [2]
 [3]]
"""

刪除、增加一行或一列

說實話,改變數組的維度不是特別常見,更常見的是刪除數組的一行或者一列,舉個栗子:

# 原始數組
[[ 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]]

這種需求相對來說更加常見一些,那么應該怎么做呢?我們來看一下。

刪除一行或一列

首先是刪除:

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.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 會將傳遞的數組扁平化(變成一維數組),然后進行刪除。舉個栗子:

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""
[[1 2 3]
 [4 5 6]]
"""
# 會將 arr 扁平化處理,然后刪除索引為 1 的元素,因此要注意 axis 參數
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] 是不行的,因為 arr 是一個二維數組
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,那么仍然會將傳遞的數組扁平化,然后進行追加:

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 默認是在尾部進行追加,并且還要求維度要匹配,不是很方便。所以這里更推薦 insert 函數:

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]]
"""
# 二維數組也是可以的
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]]
"""
# 插入一列,注意元素個數要匹配,每一列是 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 要方便很多,并且功能也更加強大一些,并且 append 完全可以使用 insert 實現,舉個栗子:

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 不指定維度,那么也是會先將數組扁平化,然后在進行 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]

以上就是關于“numpy怎么增加維度和刪除維度”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣城市| 揭阳市| 温宿县| 勐海县| 杨浦区| 吕梁市| 仲巴县| 衡山县| 隆德县| 寿宁县| 崇州市| 抚顺县| 公主岭市| 永顺县| 金华市| 达州市| 和硕县| 兴隆县| 恩平市| 长顺县| 沽源县| 伊通| 泊头市| 旌德县| 镇平县| 兖州市| 吉安市| 黔东| 襄城县| 河北区| 乳源| 天柱县| 遂昌县| 大理市| 全椒县| 呼图壁县| 德兴市| 比如县| 河北省| 安庆市| 松滋市|