[英]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.