在python中统一不同的2d数组布局

时间:2015-04-08 01:36:42

标签: python arrays numpy

我正在处理一个应用程序,该应用程序从各种数据源获取x和y坐标列表。 根据我需要访问的数据源(不在我的控制范围内),有多种方式可以返回数据。

  • x和y值的数组 - [[x1,x2,x3 ...],[y1,y2,y3 ...]]
  • 一对x,y对 - [[x1,y1],[x2,y2],...]
  • x:y值的字典 - {x1:x2,x2:y2,x3:y3,...}
  • x和y值的numpy数组 - array([[x1,x2,x3 ...],[y1,y2,y3 ...]])
  • 一对x,y对 - 数组([[x1,y1],[x2,y2],...])

使用isinstance和len / shape我知道我可以用switch语句解决这个问题。我想知道是否有更好的方法将这些转换为一致的格式,或者以一致的方式阅读这些格式。

2 个答案:

答案 0 :(得分:1)

没有办法同样对待这些结构(它们不是所有的鸭子) 但是,将其转换为一致的格式相当容易,可以选择并转换为该格式,例如

zip(*[[x1,x2,x3...],[y1,y2,y3...]]) == [(x1,y1),(x2,y2),(x3,y3)...]
zip(*[[x1,y1],[x2,y2],[x3,y3]...]) == [(x1,x2,x3...),(y1,y2,y3...)]
list({x1:x2, x2:y2, x3:y3, ...}.items()) == [(x1,y1),(x2,y2),(x3,y3)...]
dict([(x1,y1),(x2,y2),(x3,y3)...]) = {x1:x2, x2:y2, x3:y3, ...}

Numpy数组在很大程度上可以与Python列表相同。

答案 1 :(得分:0)

添加到achampion's次转化:

您可以从对列表中构建字典:

dict([[x1,y1],[x2,y2],...]) == {x1:x2, x2:y2, x3:y3, ...}

np.asarray可以将列表转换为数组,并愉快地传递一个未更改的数组。 numpy函数通常通过asarray(或变体)传递输入,以确保输入是已知维度的数组。

数组转置相当于该列表zip(*...)

np.asarray([[[x1,x2,x3...],[y1,y2,y3...]]) == np.asarray([(x1,y1),(x2,y2),(x3,y3)...]).T

我不认为你可以在没有中间名单的情况下从字典到数组。但是(n,2)数组与作为dict()输入的对列表一样有用。

因此将一种布局转换为另一种布局很容易,但我不认为有一种功能可以用于所有布局。

这些布局中的任何一个是否更便于进一步处理?

伪代码可能是:

if x is a dictioary:
   x = convert_to_list(x)
x = asarray(x)
if x.shape[0]==2 and x.shape[1]>2:
    x = x.T
# [[1,2],[3,4]] is ambiguous