[英]How to reverse index a Counter and convert it into a defaultdict? Python
[英]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.hstack
( np.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.