第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在2D數(shù)組上放置列表元素的快速方法

在2D數(shù)組上放置列表元素的快速方法

SMILET 2021-03-29 13:15:48
我有兩個列表,兩個列表都稱為位置和值。位置和值的每個子列表包含2D數(shù)組中在時間k = 1,..,n處的峰的位置和值。例如values    = [[5,1,1,8,10],[3,1,7,9,4]]positions = [[(0,0),(1,2),(1,4),(3,3),(4,4)],[(0,1),(1,3),(2,4),(3,4),(4,0)]]在此,列表[5,1,1,8,10]是2D數(shù)組上的值,[[0,0),(1,2),(1,4),(3,3),(4 ,, 4)]是這些值在時間0處的對應(yīng)位置。同樣,[3,1,7,9,4]是2D數(shù)組上的值,[[0,1),(1,3),(2,4),(3,4),(4,0 )]是這些值在時間1的對應(yīng)位置。我想將這些值放在2D零數(shù)組上的對應(yīng)位置。所以我做了以下功能import itertoolsdef list_to_array(n_1, n_2, positions, values):    new_array_list = []    for k in range(len(positions)):        A = np.zeros((n_1,n_2))        for i, j in itertools.product(range(n_1), range(n_2)):            if (i,j) in positions[k]:                X = positions[k].index((i,j))                A[i,j] = values[k][X]        new_array_list += [A]    return new_array_list這應(yīng)該返回兩個數(shù)組A[0] = [[  5.   0.   0.   0.   0.] [  0.   0.   1.   0.   1.] [  0.   0.   0.   0.   0.] [  0.   0.   0.   8.   0.] [  0.   0.   0.   0.  10.]]A[1] = [[ 0.  3.  0.  0.  0.] [ 0.  0.  0.  1.  0.] [ 0.  0.  0.  0.  7.] [ 0.  0.  0.  0.  9.] [ 4.  0.  0.  0.  0.]]對于256x256的數(shù)組,單次迭代大約需要一秒鐘,因此我需要對1600個列表執(zhí)行迭代,這雖然很長,但仍然很合理。但是,我也希望對較大的數(shù)組(每個方向的長度最多8倍)執(zhí)行此操作,因此很明顯,上面的代碼將花費太長的時間。我想知道是否有人知道更快的方法?
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

您可以使用專家?guī)臁T谶@種情況下,NumPy提供了矢量化解決方案。


對于較大的數(shù)字?jǐn)?shù)據(jù)結(jié)構(gòu),列表列表方法效率低下,因為它將使用指針的集合。取而代之的是,NumPy利用連續(xù)的存儲塊來實現(xiàn)有效的數(shù)值轉(zhuǎn)換。


import numpy as np


values    = [[5,1,1,8,10],[3,1,7,9,4]]

positions = [[(0,0),(1,2),(1,4),(3,3),(4,4)],[(0,1),(1,3),(2,4),(3,4),(4,0)]]


# convert to NumPy arrays of shapes (10,) and (10, 2)      

val = np.array(values).flatten()

pos = np.array(positions).reshape(-1, 2)


# initialize array of zeros

arr = np.zeros(pos.max(0)+1)


# assign values to positions

arr[[*pos.T]] = val


print(arr)


array([[  5.,   3.,   0.,   0.,   0.],

       [  0.,   0.,   1.,   1.,   1.],

       [  0.,   0.,   0.,   0.,   7.],

       [  0.,   0.,   0.,   8.,   9.],

       [  4.,   0.,   0.,   0.,  10.]])

如果根據(jù)您的更新,您需要2個單獨的陣列,則可以重復(fù)此過程:


# convert to NumPy arrays of shapes (10,) and (10, 2)      

val1, val2 = (np.array(v).flatten() for v in values)

pos1, pos2 = (np.array(p).reshape(-1, 2) for p in positions)


# initialize array of zeros

arr1 = np.zeros(pos1.max(0)+1)

arr2 = np.zeros(pos2.max(0)+1)


# assign values to positions

arr1[[*pos1.T]] = val1

arr2[[*pos2.T]] = val2


查看完整回答
反對 回復(fù) 2021-04-13
?
侃侃爾雅

TA貢獻1801條經(jīng)驗 獲得超16個贊

您可以這樣做:


import itertools

import numpy as np

def list_to_array(n_1, n_2, positions, values):


    new_array_list = []


    for k in range(len(positions)):


        A = np.zeros((n_1,n_2))


        for i in range(len(positions[k])):

            A[positions[k][i]] = values[k][i]

        new_array_list += [A]


    return new_array_list


values    = [[5,1,1,8,10],[3,1,7,9,4]]

positions = [[(0,0),(1,2),(1,4),(3,3),(4,4)],[(0,1),(1,3),(2,4),(3,4),(4,0)]]


print list_to_array(5,5,positions,values)


查看完整回答
反對 回復(fù) 2021-04-13
  • 2 回答
  • 0 關(guān)注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號