2011-03-03 80 views
0

我很欣赏这可能不是直接可能的,所以我会对如何解决一般情况下的这个问题感兴趣。 我有一个看起来像这样的列表项,[(array,time),(array,time)...]该数组是一个numpy数组,它可以具有任意n乘m维。这看起来像array[[derivatives dimension1],[derivatives dimension 2] ...]Python:根据输入从列表中获取项目

从列表中我想要一个函数来创建两个列表,其中将包含传递给它的位置的所有值。这些可以用于绘图。 我可以想办法用替代数据结构来做到这一点,但不幸的是,这不是一种选择。

基本上我想要的是

def f(list, pos1, pos2): 
    xs = [] 
    ys = [] 
    for i in list: 
     ys.append(i pos1) 
     xs.append(i pos2) 
    return xs, ys 

哪里i pos1相当于i[n][m] 真正的问题是,当它是1 1,所以我不能只传递整数。 任何建议将是伟大的,对不起,这篇文章有点长,我想澄清。 谢谢

+0

退房HTTP: //stackoverflow.com/editing-help以更可读的方式格式化您的问题。 – JoshAdel 2011-03-03 18:23:16

+0

'i [n] [m]'中的'n'和'm'是什么? – nmichaels 2011-03-03 18:26:41

+0

让所有阵列具有相同的尺寸? – 2011-03-03 18:31:51

回答

1

如果我正确理解你的问题,你基本上想要从列表中选择索引,并从那个选择中创建新的列表。

从列表的列表中选择指标是相当简单的,特别是如果你有选择固定数量:

parts = [(item[pos1], item[pos2]) for item in list] 

从这些选择创建一个新的列表也相当容易,使用内置zip()功能:

separated = zip(*parts) 

可以进一步通过在最后的功能。使用生成器表达式取代列表解析的减少内存使用:

def f(list, pos1, pos2): 
    partsgen = ((item[pos1], item[pos2]) for item in list) 
    return zip(*partsgen) 

这里是它的外观在行动:

>>> f([['ignore', 'a', 1], ['ignore', 'b', 2],['ignore', 'c', 3]], 1, 2) 
[('a', 'b', 'c'), (1, 2, 3)] 

更新:后重新阅读的问题和意见,我意识到这是一个有点过于简单化。但是,当您将pos1和pos2交换到包含的数组中时,总体思路仍然适用。

+0

不错,在那里我还没有想过优化一些东西。基本的问题是,当数组是1D时,你可以称它为array [i],当它是2d时,你可以将它称为数组[i] [j],而不需要两个单独的情况,我不知道如何处理它。 – Roobs 2011-03-03 19:12:30

+0

@Roobs:通过使用arr.reshape将所有东西都变成二维数组。 – Autoplectic 2011-03-03 19:35:20

0

如果我明白你的问题,类似下面应该是方便,快捷,特别是如果你需要这个多次做:

z = np.dstack([ arr for arr, time in lst ]) 
x, y = z[pos1], z[pos2] 

例如:

In [42]: a = arange(9).reshape(3,3) 
In [43]: z = np.dstack([a, a*2, a*3]) 
In [44]: z[0,0] 
Out[44]: array([0, 0, 0]) 
In [45]: z[1,1] 
Out[45]: array([ 4, 8, 12]) 
In [46]: z[0,1] 
Out[46]: array([1, 2, 3])