亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何生成如下矩陣?

如何生成如下矩陣?

HUWWW 2022-06-14 16:47:54
所以給定 numbern和一個數組a,我們需要創建一個nbylen(a)矩陣,其中矩陣的i,j第 th 項是1ifi等于jth 項,a否則-1。i即對于從0到的每個數字n-1,我們需要一個數組來告訴我們該數字i是否等于該數組a。如果我們有像函數式編程那樣的地圖功能,那就太酷了。然后我可以通過檢查數組中的每個元素a是否等于給定數字來創建行。那么有沒有我可以使用的功能,如下所示?result=[]for i in range(n):    result=np.vstack(result, np.map(checkequals(x,i),a)return result
查看完整描述

2 回答

?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

通常,函數或映射方法不是最佳的numpy。 numpy都是關于數組的,所以最好從提供的整個數組構建塊的角度來考慮numpy。那些在編譯代碼中運行。


例如你的情況:


定義一個數組:


In [10]: a = np.random.randint(0,10,9)                                          

In [11]: a                                                                      

Out[11]: array([6, 0, 2, 5, 0, 5, 2, 0, 1])

將其與值的范圍進行比較n- 使用整個數組==測試(和broadcasting。結果是一個布爾數組,每個 (i,j) 的真/假值:


In [12]: np.arange(8)[:,None]==a                                                

Out[12]: 

array([[False,  True, False, False,  True, False, False,  True, False],

       [False, False, False, False, False, False, False, False,  True],

       [False, False,  True, False, False, False,  True, False, False],

       [False, False, False, False, False, False, False, False, False],

       [False, False, False, False, False, False, False, False, False],

       [False, False, False,  True, False,  True, False, False, False],

       [ True, False, False, False, False, False, False, False, False],

       [False, False, False, False, False, False, False, False, False]])

鑒于此,很容易將其映射到 (-1,1) 值。 np.where只是這樣一種方式:


In [13]: np.where(np.arange(8)[:,None]==a, 1, -1)                               

Out[13]: 

array([[-1,  1, -1, -1,  1, -1, -1,  1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1,  1],

       [-1, -1,  1, -1, -1, -1,  1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1,  1, -1,  1, -1, -1, -1],

       [ 1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1]])

更接近您的地圖想法,我們可以定義一個對一對標量值進行操作的函數:


def foo(i,x):

    if i==x:

        return 1

    else:

        return -1

并用于np.vectorize制作一個需要 2 個數組的函數,并將成對的標量傳遞給該函數。


In [16]: np.vectorize(foo)(np.arange(8)[:,None], a)                              

Out[16]: 

array([[-1,  1, -1, -1,  1, -1, -1,  1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1,  1],

       [-1, -1,  1, -1, -1, -1,  1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1,  1, -1,  1, -1, -1, -1],

       [ 1, -1, -1, -1, -1, -1, -1, -1, -1],

       [-1, -1, -1, -1, -1, -1, -1, -1, -1]])

但這比第一種方法慢得多。


列表理解方法:


In [22]: [[(1 if i==x else -1) for x in a] for i in range(8)]                   

Out[22]: 

[[-1, 1, -1, -1, 1, -1, -1, 1, -1],

 [-1, -1, -1, -1, -1, -1, -1, -1, 1],

 [-1, -1, 1, -1, -1, -1, 1, -1, -1],

 [-1, -1, -1, -1, -1, -1, -1, -1, -1],

 [-1, -1, -1, -1, -1, -1, -1, -1, -1],

 [-1, -1, -1, 1, -1, 1, -1, -1, -1],

 [1, -1, -1, -1, -1, -1, -1, -1, -1],

 [-1, -1, -1, -1, -1, -1, -1, -1, -1]]

然后可以將其制成一個數組(這實際上可能比該vectorize方法更快)。


查看完整回答
反對 回復 2022-06-14
?
慕村9548890

TA貢獻1884條經驗 獲得超4個贊

Python2 有一個內置的map 函數, python3也是如此。Numpy 已矢量化


查看完整回答
反對 回復 2022-06-14
  • 2 回答
  • 0 關注
  • 136 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號