.. _tensor-guide:
.. currentmodule:: megengine

========================
娣卞叆鐞嗚В Tensor 鏁版嵁缁撴瀯
========================

.. toctree::
   :hidden:
   :maxdepth: 1

   fundamental-attributes
   indexing
   dtype
   device
   examples
   layout

MegEngine 涓彁渚涗簡涓€绉嶅悕涓� 鈥滃紶閲忊€� 锛�:py:class:`Tensor` 锛夌殑鏁版嵁缁撴瀯锛�
鍖哄埆浜庢暟瀛︿腑鐨勫畾涔夛紝鍏舵蹇典笌 NumPy_ 涓殑 :py:class:`~numpy.ndarray` 鏇村姞鐩镐技锛�
鍗冲紶閲忔槸涓€绫诲悓鏋勫缁存暟缁勶紝鍏朵腑姣忎釜鍏冪礌鍗犵敤鐩稿悓澶у皬鐨勫唴瀛樺潡锛屽苟涓旀墍鏈夊潡閮戒互瀹屽叏鐩稿悓鐨勬柟寮忚В閲娿€�
濡備綍瑙i噴 Tensor 涓殑鍏冪礌鐢卞叾 :ref:`鏁版嵁绫诲瀷 <tensor-dtype>` 鍐冲畾锛岃€屾瘡绉嶆暟鎹被鍨嬮兘浠h〃涓€绫� Tensor.

* 鎴戜滑鍙互鍩轰簬 Tensor 鏁版嵁缁撴瀯锛岃繘琛屽悇寮忓悇鏍风殑绉戝璁$畻锛�
* Tensor 涔熸槸绁炵粡缃戠粶缂栫▼鏃舵墍鐢ㄧ殑涓昏鏁版嵁缁撴瀯锛岀綉缁滅殑杈撳叆銆佽緭鍑哄拰杞崲閮戒娇鐢� Tensor 琛ㄧず銆�

.. _Numpy: https://numpy.org

.. note::

   涓� NumPy 鐨勫尯鍒箣澶勫湪浜庯紝MegEngine 杩樻敮鎸佸埄鐢� GPU 璁惧杩涜鏇村姞楂樻晥鐨勮绠椼€�
   褰� GPU 鍜� CPU 璁惧閮藉彲鐢ㄦ椂锛孧egEngine 灏嗕紭鍏堜娇鐢� GPU 浣滀负榛樿璁$畻璁惧锛屾棤闇€鐢ㄦ埛杩涜鎵嬪姩璁惧畾銆�

   * 濡傛灉鏈夋煡鐪�/鏀瑰彉榛樿璁$畻璁惧鐨勯渶姹傦紝璇峰弬鑰� :ref:`tensor-device` 涓殑璇存槑銆�
   * 閫氳繃 :meth:`.Tensor.to` 鍜� :func:`.functional.copy` 鍙皢 Tensor 鎷疯礉鍒版寚瀹氳澶囥€�

.. seealso::

   濡傛灉浣犺繕涓嶆竻妤氬浣曡幏寰椾竴涓� Tensor, 璇峰弬鑰� :ref:`tensor-creation` 銆�

.. _specific-concepts:

姒傚康锛堟湳璇級浣跨敤涓婄殑鍖哄垎
------------------------

鎴戜滑鎵€鎻愬埌鐨� Tensor 鐨勬蹇靛線寰€鏄叾瀹冩洿鍏蜂綋姒傚康鐨勬鎷紙鎴栬€呰鎺ㄥ箍锛夛紝涓嬮潰鏈変竴浜涗緥瀛愶細

===================== ===================== ======== ===========
鏁板                  璁$畻鏈虹瀛�            鎶借薄姒傚康 鍏疯薄鍖栦緥瀛�
===================== ===================== ======== ===========
鏍囬噺锛坰calar锛�        鏁板瓧锛坣umber锛�        鐐�       寰楀垎銆佹鐜�
鍚戦噺锛坴ector锛�        鏁扮粍锛坅rray锛�         绾�       鍒楄〃 
鐭╅樀锛坢atrix锛�        2 缁存暟缁勶紙2d-array锛�  闈�       Excel 琛ㄦ牸
===================== ===================== ======== ===========

涓嶅悓鐨勭爺绌堕鍩熷鍚屼竴涓蹇典娇鐢ㄤ笉鍚岀殑鏈杩涜鎻忚堪锛岃繖寰堝父瑙侊紝瀵硅繖浜涙蹇典笉娓呮櫚鐨勮瘽寰堝鏄撲骇鐢熺枒鎯戙€�

Python 涓彁渚涗簡 `array <https://docs.python.org/3/library/array.html>`_ 鐨勫畼鏂瑰疄鐜帮紝
浣嗗叾浣跨敤鏂规硶鍜屾垜浠彁鍒扮殑 NumPy 鏁扮粍鏈夋墍涓嶅悓锛屽洜姝ゆ垜浠彲浠ョ敤 Python 锛堝祵濂楋級鍒楄〃 :py:class:`list` 鏉ョ被姣斾妇渚嬨€�
鍦ㄥ悗缁殑椤甸潰锛屾垜浠細鎱㈡參鍦拌繃娓″埌 Tensor 鐨勫疄闄呬娇鐢ㄥ拰鎿嶄綔涓€�

娉ㄦ剰锛氫负浜嗘柟渚跨悊瑙o紝鎴戜滑杩欓噷鍋囪姝ゅ Python 鍒楄〃涓殑鏁版嵁绫诲瀷鏄竴鑷寸殑锛屾瘮濡傞兘鏄� Number 绫诲瀷銆�

.. note::

   鍦ㄦ繁搴﹀涔犻鍩燂紝鎴戜滑閫氬父灏嗕笂杩拌繖浜涙蹇电粺绉颁负寮犻噺锛圱ensor锛夈€�

.. _access-tensor-element:

璁块棶 Tensor 涓煇涓厓绱�
----------------------
瀵逛簬鏁板瓧锛堟垨鑰呰鏍囬噺锛� Tensor, 鏄剧劧鎴戜滑鍙互鐩存帴寰楀埌鍏跺€硷紝鍥犱负瀹冨彧鏈変竴涓厓绱犮€�

>>> a = 20200325
>>> a
20200325

鍏跺畠鎯呭喌涓嬶紝鎯宠鍦� Tensor 涓幏寰楁煇涓厓绱狅紝闇€瑕佹彁渚涘搴斾綅缃殑鏁存暟绱㈠紩锛圛ndex锛夛紝骞朵娇鐢ㄤ笅鏍囪繍绠楃 ``[]``:

* 娉ㄦ剰锛歍ensor 鐨勭储寮曟槸鍩轰簬闆讹紙Zero-based锛夊紑濮嬭鏁扮殑锛屽拰 Python 鍒楄〃 / NumPy 澶氱淮鏁扮粍涓€鑷达紱
* 姣斿鎴戜滑鎯宠鑾峰彇鍚戦噺/鏁扮粍 ``a = [0, 1, 2, 3, 4]`` 涓殑绗� 3 涓厓绱狅紝鎴戜滑闇€瑕佷娇鐢� ``a[2]``;
* 鍙堟瘮濡傛垜浠兂瑕佽幏鍙栦笅闈㈣繖涓� 2d-鏁扮粍 ``b`` 涓€间负 6 鐨勫厓绱狅紝鍒欓渶瑕佷娇鐢� ``b[1][2]``;

>>> b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[1]
[4, 5, 6]
>>> b[1][2]
6

鎴戜滑鍙互鐞嗚В鎴愬厛璁块棶 ``b[1]``, 鍐嶅皢 ``b[1]`` 鐪嬫垚鍗曠嫭鐨勪竴閮ㄥ垎锛屽幓璁块棶 ``b[1]`` 涓储寮曚负 2 鐨勫厓绱犮€�

浜岀淮鎯呭喌鍙互绫绘瘮鎴愭垜浠湪鐭╅樀 :math:`M` 涓寜鐓у厛琛屽悗鍒楃殑椤哄簭鍘昏幏鍙栧厓绱犫€斺€�

.. math::

   M =
   \begin{bmatrix}
	1 & 2 & 3 \\
	4 & 5 & \color{blue}{6} \\
	7 & 8 & 9 \\
   \end{bmatrix}
   \quad
   M_{(1,2)} = 6

鍦ㄦ洿楂樼淮搴︾殑鎯呭喌涓嬶紝鍐嶇敤涓撻棬鐨� 鈥滄爣閲忊€濓紝鈥滃悜閲忊€濓紝鈥滅煩闃碘€�... 鏈鍘诲畾涔夌粨鏋勬槸寰堜笉鐜板疄鐨勩€�

* 鍥犳鍦ㄦ暟瀛︿腑鎻愪緵浜� n 缁村紶閲忕殑姒傚康锛屽搴斿湴锛孨umPy 涓彁渚涗簡 n 缁存暟缁勶紱
* n 缁村紶閲忓拰 n 缁存暟缁勪腑鐨� n 鍒欒〃鏄庝粠涓幏鍙栧厓绱犻渶瑕佹彁渚� n 涓储寮曞€笺€�

===================== ===================== ======================
鏁板                  璁$畻鏈虹瀛�            鑾峰彇鍊兼墍闇€鏍囬噺绱㈠紩鏁伴噺
===================== ===================== ======================
鏍囬噺锛坰calar锛�        鏁板瓧锛坣umber锛�        0
鍚戦噺锛坴ector锛�        鏁扮粍锛坅rray锛�         1
鐭╅樀锛坢atrix锛�        2 缁存暟缁勶紙2d-array锛�  2
n 缁村紶閲忥紙nd-tensor锛� n 缁存暟缁勶紙nd-array锛�  n
===================== ===================== ======================

鐜板湪鎴戜滑宸茬粡鍙互蹇樻帀涓婇潰杩欎簺鏈锛岀粺涓€鐢� n 鏉ョ‘瀹� Tensor 缁村害鐨勬暟閲忋€�

鍥犳鎴戜滑鍙互杩欐牱鐞嗚В锛�

* 涓€涓爣閲忔槸涓€涓� 0 缁� Tensor;
* 涓€涓悜閲忔槸涓€涓� 1 缁� Tensor;
* 涓€涓煩闃垫槸涓€涓� 2 缁� Tensor;
* 涓€涓� n 缁存暟缁勬槸涓€涓� n 缁� Tensor.

鑰屽湪璁块棶 n 缁� Tensor 锛堝亣瀹氫负 :math:`T` 锛夌殑鐗瑰畾鏌愪釜鍏冪礌鏃讹紝鍙互浣跨敤濡備笅璇硶锛�

.. math::

   T_{[i_1][i_2]\ldots [i_n]}

鍗虫垜浠鎻愪緵 :math:`i_1, i_2, \ldots ,i_n` 鍏� n 涓储寮曞€硷紝姣忔绱㈠紩闄嶄綆涓€涓淮搴︼紝鏈€缁堝緱鍒� 0 缁存暟瀛楋紙鏍囬噺锛夈€�

姣斿鎴戜滑寰楃煡瑕佹壘鐨勬煇涓汉浣忓湪鏌愬皬鍖虹殑 23 鍙锋ゼ 3 鍗曞厓 902 瀹わ紝鍥犳鎴戜滑闇€瑕佽闂� ``court[23][3][9][2]``;

.. seealso::

   瀹為檯涓婏紝瀵逛簬 Tensor 鍜屽缁存暟缁勶紝鏈夌潃鏇村姞楂樻晥鐨勭储寮曟柟娉曪紝鍙弬鑰� :ref:`multi-dim-indexing` 鐨勭敤娉曘€�

.. note::

   娣卞害瀛︿範棰嗗煙鐨� Tensor 鍏跺疄灏辨槸涓€涓缁存暟缁勶紙N 缁存暟缁勶級銆�

.. _tensor-slice:

浣跨敤鍒囩墖鑾峰彇閮ㄥ垎鍏冪礌
--------------------

鍓嶉潰鎴戜滑灞曠ず浜嗗浣曡闂崟涓殑鍏冪礌锛屽彟涓€绉嶆瘮杈冨父瑙佺殑鎯呭喌鏄渶瑕佸閮ㄥ垎鍏冪礌杩涜璁块棶銆�

涓� Python 涓€鑷达紝鎴戜滑鍙互浣跨敤鍒囩墖锛圫licing锛夋搷浣滅鏉ヨ闂拰淇敼 Tensor 瀵硅薄涓殑閮ㄥ垎鍏冪礌锛�

>>> a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[2:8:2]
[2, 4, 6]

瑙傚療涓婇潰鐨勪緥瀛愶紝鎴戜滑閫氳繃 ``:`` 绗﹀彿杩涜浜嗗垏鐗囨搷浣滐紝璇硶涓� ``start:stop:step``, 瀵瑰簲璧峰绱㈠紩銆佺粓姝㈢储寮曞拰姝ラ暱銆�
杩欑鍐欐硶瀹為檯涓婂湪鑳屽悗涓烘垜浠敓鎴愪簡涓€涓垏鐗囧璞� ``slice(start:stop:step)``, 浜岃€呮槸绛変环鐨勶細

>>> myslice = slice(2, 8, 2)
>>> a[myslice] 
[2, 4, 6]

.. note::

   * ``start``, ``stop``, ``step`` 涔熷彲浠ユ槸璐熸暟锛屾剰鍛崇潃绱㈠紩鍙樺寲椤哄簭涓庨粯璁ゆ儏鍐电浉鍙嶃€�
   * ``start`` 鍜� ``stop`` 绱㈠紩鍖洪棿鏄乏闂彸寮€鐨� ``[start, stop)`` 褰㈠紡锛屽嵆 ``a[stop]`` 鏈韩涓嶅湪鍒囩墖鑼冨洿涔嬪唴銆�
   * 杩欎釜璁捐鍏跺疄涓庡熀浜庨浂鐨勭储寮曟柟寮忓搴旓紝璇ヨ璁$殑濂藉鏈夊緢澶氾細
     褰撳彧鏈夋渶鍚庝竴涓綅缃俊鎭椂锛屾垜浠篃鍙互蹇€熻绠楀嚭鍒囩墖鍜屽尯闂村唴鏈夊嚑涓厓绱�;
     鍚岀悊浣跨敤 ``stop`` 鍑忓幓 ``start`` 鍙互蹇€熻绠楀嚭鍒囩墖鍜屽尯闂寸殑闀垮害锛屼笉瀹规槗娣锋穯锛�
     涓庢鍚屾椂锛屾垜浠彲浠ョ敤 ``a[:i]`` 鍜� ``a[i:]`` 鑾峰緱鍘熷鏁版嵁鍒嗗壊鍚庝笉閲嶅彔鐨勪袱閮ㄥ垎銆�

.. seealso::

   璁$畻鏈虹瀛﹀锛孍dsger W. Dijkstra 鏁欐巿鍦ㄣ€奰Why numbering should start at zero 
   <https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html>`_ 銆�
   涓殑鍐呭涓哄熀浜� 0 鐨勪笅鏍囦互鍙婂乏闂彸寮€鐨勫尯闂翠範鎯繘琛屼簡寰堝ソ鐨勮В閲娿€�

鍙﹀锛屽垏鐗囪娉曚腑鐨勯儴鍒嗗厓绱犲彲浠ヨ鐪佺暐锛�

* 濡傛灉涓嬫爣杩愮畻绗︿腑娌℃湁浠讳綍鍐掑彿杩愮畻绗﹀ ``a[i]``, 鍒欒繑鍥炰笌璇ョ储寮曚綅缃搴旂殑鍗曚釜鍏冪礌锛�
* 濡傛灉涓嬫爣杩愮畻绗︿腑鍙湁涓€涓啋鍙疯繍绠楃锛屽垯闇€瑕佹牴鎹笉鍚岀殑鍐欐硶杩涜鍒ゆ柇锛�

  * 濡傛灉涓� ``a[start:]``, 鍒欒〃鏄庝粠 ``start`` 浣嶇疆寰€鍚庣殑鎵€鏈夐」閮借鎻愬彇锛�
  * 濡傛灉涓� ``a[:stop]``, 鍒欒〃鏄庝粠 ``stop`` 浣嶇疆寰€鍓嶇殑鎵€鏈夐」閮借鎻愬彇锛�
  * 濡傛灉涓� ``a[start:stop]``, 鍒欒〃鏄庝粠 ``start`` 鍒� ``stop`` 鐨勬墍鏈夐」灏嗚鎻愬彇锛�

* 濡傛灉娌℃湁鎸囧畾 ``step``, 鍒欓粯璁ゆ彁鍙栧垏鐗囪寖鍥村唴鐨勬墍鏈夐」鐩€�

澶氱淮鏁扮粍涔熸敮鎸佷娇鐢ㄥ垏鐗囪娉曪細

>>> b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0:2]
[[1, 2, 3], [4, 5, 6]]

姝ゆ椂鍙互灏嗗叾褰撲綔鏄竴涓竴缁存暟缁勫幓鐞嗚В锛岄噷闈㈢殑姣忎釜鍏冪礌鍙堟槸涓€缁存暟缁勶細

>>> a1 = [1, 2, 3]
>>> a2 = [4, 5, 6]
>>> a3 = [7, 8, 9]
>>> b = [a1, a2, a3]
>>> b[0:2]
[[1, 2, 3], [4, 5, 6]]
>>> [a1, a2]
[[1, 2, 3], [4, 5, 6]]

鎴戜滑杩欓噷浠呬粎瀵规渶澶栭潰杩欎竴灞傝繘琛屼簡绱㈠紩锛屽湪 :ref:`tensor-indexing` 涓細璁茶В鏇村鏉傜殑鎯呭喌銆�

.. seealso::

   浣跨敤鍒囩墖绱㈠紩鍙互浠� Tensor 涓闂儴鍒嗗厓绱狅紝浣嗘湁浜涙椂鍊欐垜浠笇鏈涜幏寰楃殑閮ㄥ垎鍏冪礌鏄笉杩炵画鐨勶紝
   鑰屾槸鍑犱釜鐗瑰畾浣嶇疆鍏冪礌鐨勭粍鍚堬紝姝ゆ椂鍙互浣跨敤 :ref:`鏁扮粍绱㈠紩 <array-indexing>` 銆�

鎺ヤ笅鏉ワ細Tensor 鍩虹灞炴€�
-----------------------

閫氳繃鏈皬鑺傜殑鍐呭锛岀敤鎴疯兘澶熸帉鎻℃渶鍩烘湰鐨� Tensor 姒傚康銆�

涓轰簡鏂逛究鍒濆鑰呭涔犲拰杩囨浮锛屽湪涓婇潰鐨勪唬鐮佺ず渚嬩腑锛屾垜浠竴鐩村湪浣跨敤 Python 鐨� ``list`` 鏉ヤ妇渚嬶紝
浠ヨ〃鏄� MegEngine Tensor 鏁版嵁缁撴瀯涓� Python 宓屽鍒楄〃璁捐鐨勪竴鑷存€э紝浣嗗疄闄呬笂浜岃€呰繕鏄瓨鍦ㄧ潃涓€瀹氱殑鍖哄埆銆�

鎴戜滑鍐嶄妇涓€浜涗緥瀛愶紝璇蜂綘灏濊瘯鐚滄祴涓€涓嬭緭鍑猴細

.. panels::
   :container: +full-width
   :card:

   Python nested list
   ^^^^^^^^^^^^^^^^^^
   >>> c = [[1, 2, 3],
   >>>      [4, 5, 6],
   >>>      [7, 8, 9]]
   >>> c[1, 1]
   ---
   MegEngine 2-d Tensor
   ^^^^^^^^^^^^^^^^^^^^
   >>> c = Tensor([[1, 2, 3],
   >>>             [4, 5, 6],
   >>>             [7, 8, 9]])
   >>> c[1, 1]

Python 宓屽鍒楄〃骞朵笉鏀寔杩欑璇硶锛屼綘鑳界寽娴嬪嚭鍦� ``[]`` 杩愮畻绗︿腑浣跨敤 ``,`` 鐨勪綔鐢ㄥ悧锛�

鍋囪鎴戜滑鐜板湪闇€瑕佷粠涓嬮潰杩欎釜 2 缁� Tensor 涓彇鍑鸿摑鑹查儴鍒嗙殑鍏冪礌锛屽張闇€瑕佸浣曞仛鍛紵
锛� :ref:`瑙i噴 <multi-dim-slicing>` 锛�

.. math::

   M =
   \begin{bmatrix}
	1 & 2 & 3 \\
	\color{blue}{4} & \color{blue}{5} & 6 \\
	7 & 8 & 9 \\
   \end{bmatrix}
   \quad
   M_{(?, ?)} = (4 \ 5)

鎯宠瑙g瓟杩欎簺闂锛屼綘蹇呴』鍏堢悊瑙� Tensor 鐨� :ref:`tensor-fundamental-attributes` 绛夋湁鍏虫蹇碉紝
鏇村ソ鍦扮悊瑙� Tensor 鎵€鍏峰鐨勪竴浜涚壒鐐癸紝鎺ョ潃浠� :ref:`tensor-indexing` 鐨勫唴瀹逛腑鎵惧埌绛旀銆�

.. seealso::

   Tensor 鏁版嵁绫诲瀷
     鎴戜滑鎻愬埌浜� Tensor 涓殑姣忎釜鍏冪礌鐨勬暟鎹被鍨嬩竴鑷达紝濡傛灉浣犳兂瑕佺煡閬撳叿浣撴湁鍝簺鏁版嵁绫诲瀷鐨� Tensor,
     璇峰弬鑰� :ref:`tensor-dtype` 銆�

   Tensor 鎵€鍦ㄨ澶�
     鑳藉鍒╃敤 GPU 璁惧杩涜楂樻晥杩愮畻鏄� MegEngine 鐩歌緝浜� NumPy 鐨勪紭鍔匡紝鎯宠浜嗚В涓嶅悓璁惧涔嬮棿鐨勫尯鍒紝
     璇峰弬鑰� :ref:`tensor-device` 銆�

   Tensor 鍏疯薄鍖栦妇渚�
     濡傛灉浣犵洰鍓嶅浜� Tensor 鐨勬蹇典笉澶熺洿瑙傦紝鍙互鍙傝€� :ref:`tensor-examples` 銆�

   Tensor 鍐呭瓨甯冨眬
     涓€浜涙湁缁忛獙鐨勫紑鍙戣€呭枩娆㈢爺绌跺簳灞傜殑缁嗚妭锛屽彲浠ュ弬鑰� :ref:`tensor-layout` 銆�

.. admonition:: Python 鏁版嵁 API 鏍囧噯鑱旂洘鍗忎細
   :class: note

   MegEngine 涓殑璁稿 Tensor 鏍囧噯 API 璁捐閬靛惊浜� Python 鏁版嵁 API 鏍囧噯鑱旂洘鍗忎細鐨勫€″锛�
   涓€浜涘父瑙佺殑瀹炵幇灏藉彲鑳藉湴鍚� NumPy 闈犺繎锛屾洿澶氱粏鑺傚彲浠ュ弬鑰� `Consortium for Python Data API Standards
   <https://data-apis.org/>`_ .