解压缩坐标和值的字典

时间:2018-02-12 08:19:35

标签: python python-3.x numpy

我希望填充值xyz,其中x是x坐标,y是y坐标,{{1由z定义的每个坐标的关联值。我是这样做的:

p

还有另一种更易读的方式吗?这可能是numpy或scipy有什么用呢?

为什么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))) 会产生z,而array([10, 11, 12], dtype=object) x不会包含y

4 个答案:

答案 0 :(得分:6)

作为一个班轮怎么样?

.nuspec

这样可以更清楚地显示值的来源,而不会显示不必要的和未使用的x, y, z = np.array([(x, y, z) for (x, y), z in p.items()]).T 。此外,您不应该遇到k问题。

答案 1 :(得分:2)

为什么dtype = object?

考虑第二行,现在只有一个变量赋值:

w = np.array(list(zip(*p.items())))
print(w)

这里,w成为一个由一行元组和一行整数组成的数组。无论何时涉及这种混合类型,都使用通用object数据类型(dtype)。在您的代码中,您实际上拥有k, z = w,因此即使将整数存储在z中,他们也会保留dtypeobject)。

更清洁的方式

我们可以在一行中

x, y, z = np.array([(x, y, z) for (x, y), z in p.items()]).T

这里,生成一个列表,其中存储了(x, y, z)形式的元组。然后将其转换为2D NumPy数组。最后,这个数组(或矩阵)被转置(.T),然后分配给xyz。否则需要换位,矩阵的行将分配到xyz(尝试省略.T并自己查看效果)

答案 2 :(得分:1)

如果您使用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

答案 3 :(得分:1)

因为我喜欢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。