繁体   English   中英

解压缩坐标和值的字典

[英]unzip a dictionary of coordinates and values

我希望填充值xyz ,其中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) ,而xy不包括dtype=object

作为一个班轮怎么样?

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

这样可以更清楚地显示值的来源,而不需要不必要的和未使用的k 此外,你不应该有这个问题的dtype问题。

为什么dtype = object?

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

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

这里, w成为由一行元组和一行整数组成的数组。 每当涉及这种混合类型时,都使用通用object数据类型( dtype )。 在你的代码中,你实际上有k, z = w ,所以即使int存储在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并自己查看效果)。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM