1. 程式人生 > >【深度學習】MXNet基本資料結構NDArray常用操作

【深度學習】MXNet基本資料結構NDArray常用操作

文章目錄

概述

在MXNet深度學習框架中,NDArray是儲存和變換資料的主要工具,和NumPy中的ndarray有異曲同工之妙。

在下面的示例中,主要展示了:

  1. NDarray的建立;
  2. NDArray之間的基本運算;
  3. NDArray廣播機制;
  4. NDArray索引;
  5. NDArray記憶體開銷;
  6. NDArray和NumPy多維陣列之間的轉換。

示例

# coding=utf-8
# author: BebDong
# 2018.12.10
# MXNet資料操作:NDArray是MXNet中主要的資料儲存和變換工具
from mxnet import nd import numpy as np print('------- Create NDArray -------') # 使用arange函式建立行向量 x = nd.arange(12) print(x) # 使用shape函式獲取形狀 print(x.shape) # 使用size函式獲取元素個數 print(x.size) # 使用reshape函式更改形狀,已知元素個數情況下三種等價形式。 # X = x.reshape((3, 4)) # X = x.reshape((3, -1)) X = x.reshape((-1, 4)) print
(X) # 通過list物件建立NDArray lst = [[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]] Y = nd.array(lst) print(Y) # 隨機生成值,下列從均值為0標準差為1的正太分佈隨機取樣 print(nd.random.normal(0, 1, shape=(3, 4))) # 建立一個元素均為0,形狀為(2,3,4)的張量。向量和矩陣都是特殊的張量 print(nd.zeros((2, 3, 4))) # 建立一個元素均為1,形狀為(2,3,4)的張量 print(nd.ones((2, 3, 4))) print('\n------- Operations on NDArrays -------'
) # 按元素做四則運算 print(X + Y) print(X * Y) print(X - Y) print(X / Y) # 按元素做指數運算:兩種形式 # print(nd.exp(Y)) print(Y.exp()) # 使用dot函式做點乘 print(nd.dot(X, Y.T)) # 使用concat函式連線多個NDArray:維度0表示在行上連線,維度1表示在列上連線 print(nd.concat(X, Y, dim=0)) print(nd.concat(X, Y, dim=1)) # 使用條件運算子可以得到元素為0或1的新NDArray print(X == Y) print(X < Y) print(X > Y) # 對所有元素求和,得到單元素NDArray:兩種形式 # print(nd.sum(X)) print(X.sum()) # 求範數(L2),得到單元素NDArray:兩種形式 # print(X.norm()) print(nd.norm(X)) # 使用asscalar函式將結果轉換為標量 print(X.norm().asscalar()) print('\n------- Broadcast Mechanism -------') # 當兩個形狀不同的NDArray按元素操作時,將觸發廣播機制(broadcasting):適當複製元素使得形狀相同再操作 A = nd.arange(3).reshape((3, 1)) B = nd.arange(2).reshape((1, 2)) print(A + B) print('\n------- Index of NDArray -------') # 重新為單個元素賦值 X[1, 2] = 9 print(X) # 索引從0開始,擷取的時候遵從“左閉右開”的原則 print(X[1:3]) # 擷取一部分元素同時賦值 X[1:2, :] = 12 print(X) print('\n------- Memory Cost -------') # 前面的例子中對每個操作都新開記憶體來儲存運算結果。即使X = X + Y,也是新開記憶體然後X再指向新記憶體。下例進行了驗證 before = id(X) X = X + Y after = id(X) print(before == after) # 指定記憶體儲存(也建立了臨時記憶體)。下例中zeros_like函式建立形狀相同且元素為0的NDArray Z = X.zeros_like() before = id(Z) # Z[:] = Z + Y Z += Y after = id(Z) print(before == after) # 避免記憶體開銷,包括臨時記憶體:運算子全名函式的out引數指定 nd.elemwise_add(X, Y, out=Z) print(id(Z) == before) print('\n------- NDArray && NumPy -------') # 使用nd.array函式從NumPy格式建立NDArray。 P = np.ones((2, 3)) D = nd.array(P) print(D) # 將NDArray變換為NumPy格式 print(D.asnumpy(), '\n', type(D.asnumpy()))