【深度學習】MXNet基本資料結構NDArray常用操作
阿新 • • 發佈:2018-12-15
文章目錄
概述
在MXNet深度學習框架中,NDArray是儲存和變換資料的主要工具,和NumPy中的ndarray有異曲同工之妙。
在下面的示例中,主要展示了:
- NDarray的建立;
- NDArray之間的基本運算;
- NDArray廣播機制;
- NDArray索引;
- NDArray記憶體開銷;
- 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()))