[英]unzip a dictionary of coordinates and values
我希望填充值x
, y
和z
,其中x
是x坐標, y
是y坐標, z
是每個坐標的關聯值,由p
定義。 我是這樣做的:
p = {(1,2): 10, (0,2):12, (2,0):11}
k,z = np.array(list(zip(*p.items())))
x,y = np.array(list(zip(*k)))
還有另一種更易讀的方式嗎? 這可能是numpy或scipy有什么用呢?
為什么z
導致array([10, 11, 12], dtype=object)
,而x
和y
不包括dtype=object
?
作為一個班輪怎么樣?
x, y, z = np.array([(x, y, z) for (x, y), z in p.items()]).T
這樣可以更清楚地顯示值的來源,而不需要不必要的和未使用的k
。 此外,你不應該有這個問題的dtype
問題。
考慮第二行,現在只有一個變量賦值:
w = np.array(list(zip(*p.items())))
print(w)
這里, w
成為由一行元組和一行整數組成的數組。 每當涉及這種混合類型時,都使用通用object
數據類型( dtype
)。 在你的代碼中,你實際上有k, z = w
,所以即使int存儲在z
,它們也會保留它們的dtype
( object
)。
在一行中我們可以做到
x, y, z = np.array([(x, y, z) for (x, y), z in p.items()]).T
這里,生成存儲形式(x, y, z)
元組的列表。 然后將其轉換為2D NumPy數組。 最后,將該數組(或矩陣)轉置( .T
),然后分配給x
, y
和z
。 否則需要換位,矩陣的行將分配給x
, y
和z
(嘗試省略.T
並自己查看效果)。
如果您使用Pandas,解決方案將非常易讀:
import pandas as pd
data = pd.Series(p)
#0 2 12
#1 2 10
#2 0 11
如果最終你想要numpy數組:
x = data.reset_index()['level_0'].values
y = data.reset_index()['level_1'].values
z = data.values
既然我喜歡numpy,我會選擇以下內容:
keys = np.array(list(p.keys()))
vals = np.matrix(list(p.values()))
comb = np.concatenate((keys, vals.T), axis=1)
x, y, z = comb.T
可讀性取決於如何習慣numpy。
那里有兩個技巧。 首先,如果字典沒有改變,字典項的排序不會改變,所以我們可以分別調用鍵和值。 第二種是使用np.matrix作為值,以便轉置起作用,因為在numpy中轉換1D數組是一個nop。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.