簡體   English   中英

如何將 Python Defaultdict 中的值轉換為 Numpy 數組?

[英]How to convert the values in a Python Defaultdict to a Numpy array?

我希望多個值屬於同一個鍵,所以我使用了 Python defaultdict 來解決這個問題。 但是,由於現在 defaultdict 中的值是嵌套列表,如何使嵌套列表的每個元素成為 Numpy ndarray 的一行?

假設我的 defaultdict 看起來像這樣:

my_dict = defaultdict(list)

*** in some for loop *** 
 my_dict[key].append(value) # key is a string and value is a Numpy array of shape (1,10)
*** end of the for loop ***

我想最慢的方法是使用嵌套的 for 循環,例如:

data = np.empty((0,10),np.uint8)
for i in my_dict:
    for j in my_dict[i]:
        data = np.append(data,j,axis=0)   

有沒有更快的方法來做到這一點?

而不是使用defaultdict(list)使用setdefault功能,這將使您免於嵌套列表

my_dict = dict()
for key, value in values:
    my_dict[key] = np.append(my_dict.setdefault(key, value), value)

data = np.array(list(my_dict.values()))

您應該提供一個示例,但我認為以下內容與您的代碼所暗示的一樣普遍。

In [131]: from collections import defaultdict
In [132]: dd = defaultdict(list)
In [133]: dd[1].append(np.ones((1,5),int))
In [134]: dd[2].append(2*np.ones((1,5),int))
In [135]: dd[1].append(3*np.ones((1,5),int))

In [136]: dd
Out[136]: 
defaultdict(list,
            {1: [array([[1, 1, 1, 1, 1]]), array([[3, 3, 3, 3, 3]])],
             2: [array([[2, 2, 2, 2, 2]])]})

幾個建議從以下位置制作數組:

In [137]: list(dd.values())
Out[137]: 
[[array([[1, 1, 1, 1, 1]]), array([[3, 3, 3, 3, 3]])],
 [array([[2, 2, 2, 2, 2]])]]

但是,如果每個列表中有多個數組,那是行不通的。

我們可以用類似於您的代碼的東西來展平嵌套的謊言,但使用更快的列表 append:

In [140]: alist = []
     ...: for i in dd:
     ...:     for a in dd[i]:
     ...:         alist.append(a)
     ...:         
In [141]: alist
Out[141]: [array([[1, 1, 1, 1, 1]]), array([[3, 3, 3, 3, 3]]), array([[2, 2, 2, 2, 2]])]

我們可以從中創建一個二維數組(前提是子數組的形狀匹配):

In [142]: np.vstack(alist)
Out[142]: 
array([[1, 1, 1, 1, 1],
       [3, 3, 3, 3, 3],
       [2, 2, 2, 2, 2]])

要么:

In [144]: np.array(alist).shape
Out[144]: (3, 1, 5)

作為一般規則,重復np.append是低效的。 當迭代不可避免時,列表 append(或列表理解)是最好的。

伙計們

嘗試根據@Guy 的建議重新創建字典:

In [147]: my_dict = dict()
     ...: key,value=(1,np.ones((1,5),int)); my_dict[key]= np.append(my_dict.setdefault(key, value), value)

我更願意在這里使用np.hstacknp.append被濫用得太頻繁了)。

In [148]: key,value=(2,2*np.ones((1,5),int)); my_dict[key]= np.append(my_dict.setdefault(key, value), value)    
In [149]: key,value=(1,3*np.ones((1,5),int)); my_dict[key]= np.append(my_dict.setdefault(key, value), value)

In [150]: my_dict
Out[150]: 
{1: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3]),
 2: array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

對於某些添加,這具有重復的值。 list(my_dict.values())制作一個數組並不容易。

我們可以將 dict 值收集為 arrays,但這並不像列表那樣簡單。 數組沒有簡單的“空”,也沒有就地“追加”。

In [157]: dd = defaultdict(lambda: np.zeros([0,5],int))
In [158]: dd[1]=np.vstack((dd[1],(np.ones((1,5),int))))
In [159]: dd[2]=np.vstack((dd[2],(2*np.ones((1,5),int))))
In [160]: dd[3]=np.vstack((dd[3],(3*np.ones((1,5),int))))

In [161]: dd
Out[161]: 
defaultdict(<function __main__.<lambda>()>,
            {1: array([[1, 1, 1, 1, 1]]),
             2: array([[2, 2, 2, 2, 2]]),
             3: array([[3, 3, 3, 3, 3]])})

In [162]: np.vstack(list(dd.values()))
Out[162]: 
array([[1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3]])

這樣就避免了dict構造完成后的一次迭代,但是dict的構造更復雜也更慢。 所以我認為這沒有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM