99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代numpy.einsum如何理解和運用?
numpy.einsum如何理解和運用?
2023-04-07
收藏

numpy.einsum是NumPy庫提供的一個強大的函數(shù),它可以對多維數(shù)組進行高效的計算和操作。einsum函數(shù)的全稱為“Einstein Summation”,它的主要功能是對多個數(shù)組進行運算并且輸出結(jié)果。在這篇文章中,我們將通過介紹einsum函數(shù)的使用方式和示例來幫助你更好地理解和運用它。

語法和參數(shù)

einsum函數(shù)的基本語法如下:

numpy.einsum(subscripts, *operands, out=None, dtype=None, order='K', casting='safe',
             optimize=False)

其中,subscripts參數(shù)是一個字符串,用于指定計算的方式和輸出結(jié)果的格式;operands參數(shù)則是一個或多個需要參與計算的數(shù)組。其他參數(shù)包括:

  • out:指定輸出結(jié)果存儲的位置;
  • dtype:指定輸出結(jié)果的數(shù)據(jù)類型;
  • order:指定輸入數(shù)組的存儲順序;
  • casting:指定數(shù)據(jù)類型轉(zhuǎn)換的方式;
  • optimize:是否啟用優(yōu)化選項。

subscripts參數(shù)

subscripts參數(shù)是einsum函數(shù)最重要的參數(shù)之一,它用于指定計算方式和輸出結(jié)果的格式。在subscripts參數(shù)中,每個字母都代表一個維度,而逗號則表示不同的數(shù)組之間。例如,對于兩個形狀分別為(3, 4)(4, 5)的二維數(shù)組A和B,我們可以使用以下方式來計算它們的矩陣乘積:

import numpy as np

A = np.random.rand(3, 4)
B = np.random.rand(4, 5)
C = np.einsum('ij,jk->ik', A, B)
print(C)

在這個例子中,'ij,jk->ik'就是subscripts參數(shù),它表示了矩陣乘法的計算方式。具體來說,'ij'表示第一個數(shù)組(即A)的前兩個維度,'jk'表示第二個數(shù)組(即B)的后兩個維度,而'->ik'則表示輸出結(jié)果的維度應(yīng)該是前兩個維度與后兩個維度的交叉相乘。

除了使用單個字母代表維度之外,我們還可以使用多個字母組合來表示某些軸上的求和。例如,如果我們想要計算一個三維數(shù)組的所有元素之和,可以使用以下代碼:

import numpy as np

A = np.random.rand(3, 4, 5)
s = np.einsum('ijk->', A)
print(s)

在這個例子中,'ijk->'表示對三維數(shù)組A的所有元素求和。注意,'->'后面沒有任何字母,這意味著輸出結(jié)果不包含任何維度。

示例:張量乘積

einsum函數(shù)不僅可以用于矩陣乘法,還可以廣泛地應(yīng)用到各種線性代數(shù)、物理和機器學(xué)習(xí)問題中。其中一個常見的應(yīng)用就是計算張量乘積。對于兩個形狀分別為(n1, n2, ..., nk)(m1, m2, ..., mk)的$k$階張量$A$和$B$,它們的乘積$C$的形狀為$(n_1m_1, n_2m_2, ..., n_km_k)$,它的元素由以下公式給出:

$$C_{i_1m_1 + j_1, i_2m_2 + j_2, ..., i_km_k + j_k} = A_{i_1, i_2, ..., i_k}B_{j_1, j_2, ..., j_k}$$

其中$i_

在NumPy中,我們可以使用einsum函數(shù)來計算張量乘積。以下是一個簡單的示例:

import numpy as np

A = np.random.rand(2, 3, 4)
B = np.random.rand(5, 4, 3)

C = np.einsum('ijk,lji->il', A, B)

print(C.shape)  # 輸出 (2, 5)

在這個示例中,我們定義了兩個三維數(shù)組A和B,它們的形狀分別為(2, 3, 4)(5, 4, 3)。然后,我們使用einsum函數(shù)來計算它們的張量乘積,并將結(jié)果存儲在數(shù)組C中。具體來說,我們使用字符串'ijk,lji->il'來指定計算方式,其中'ijk'表示第一個數(shù)組(即A)的三個維度,'lji'表示第二個數(shù)組(即B)的三個維度,而'->il'則表示輸出結(jié)果應(yīng)該是形狀為(2, 5)的二維數(shù)組。

示例:多個數(shù)組的元素乘積

除了矩陣乘法和張量乘積之外,einsum函數(shù)還可以用于各種元素級別的計算。例如,我們可以使用einsum函數(shù)來計算多個數(shù)組的元素乘積。以下是一個簡單的示例:

import numpy as np

A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
C = np.array([7, 8, 9])

D = np.einsum('i,i,i->', A, B, C)

print(D)  # 輸出 104

在這個示例中,我們定義了三個一維數(shù)組A、B和C,并且使用einsum函數(shù)來計算它們的元素乘積。具體來說,我們使用字符串'i,i,i->'來指定計算方式,其中每個'i'都表示對應(yīng)數(shù)組的元素,而'->'則表示輸出結(jié)果不包含任何維度。輸出結(jié)果為標(biāo)量值104,它是A、B和C三個數(shù)組對應(yīng)位置元素相乘的總和。

總結(jié)

numpy.einsum函數(shù)是一個強大的工具,它可以用于各種復(fù)雜的多維數(shù)組計算和操作。本文介紹了einsum函數(shù)的語法和參數(shù),以及幾個常見的示例。如果你需要處理多維數(shù)組數(shù)據(jù),或者需要進行一些高級的線性代數(shù)運算,那么einsum函數(shù)就是一個非常有用的工具。不過,在編寫代碼時,我們建議仔細查看einsum函數(shù)的文檔,確保正確理解計算方式和輸出結(jié)果的格式,以避免出現(xiàn)錯誤。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }