我希望填充值x
,y
和z
,其中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
?
答案 0 :(得分:6)
作为一个班轮怎么样?
.nuspec
这样可以更清楚地显示值的来源,而不会显示不必要的和未使用的x, y, z = np.array([(x, y, z) for (x, y), z in p.items()]).T
。此外,您不应该遇到k
问题。
答案 1 :(得分:2)
考虑第二行,现在只有一个变量赋值:
w = np.array(list(zip(*p.items())))
print(w)
这里,w
成为一个由一行元组和一行整数组成的数组。无论何时涉及这种混合类型,都使用通用object
数据类型(dtype
)。在您的代码中,您实际上拥有k, z = w
,因此即使将整数存储在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
并自己查看效果)
答案 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。