2012-01-05 38 views
0

我在安排和替换python列表或数组时遇到了问题。 我有两个阵列,让说a和b如,如何将一个列表中的某些值替换为另一个相同类型的值?

a = [[ 0. 0. -2.5 0. ] 
    [ 0. 0. -2. 0. ] 
    [ 0. 0. -1.5 0. ] 
     ..............., 
    [ 2.5 2. 1. 0. ] 
    [ 2.5 2. 1.5 0. ] 
    [ 2.5 2. 2. 0. ]]  

共有300行与4个元件的每一行是。它的排列方式为[ x y z val ], 这意味着对于每个x,y,z点,我有一个值'val',初始化为零点为300 点。 x,y,z具有最小值和最大值x-min = 0,x-max = 2.5; y-min = 0,y-max = 2.0; z-min = -2.5,z-max = 2.0。

我有另一个列表,B为

b = [[ 0.   0.  -2.5  21.793416 ] 
    [ 0.   0.5  -2.5  20.30 ] 
    [ 0.   1.  -2.5  16.66 ] 
    [ 0.   1.5  2.  -16.61 ] 
    [ 0.   2.  -2.5  9.06 ] 
    [ 0.   2.  -2.   9.81 ] 
    [ 0.   2.  -1.5  9.65 ] 
    [ 1.5  2.   0.5  -4.42 ] 
    [ 1.5  2.   1.  -7.44 ] 
    [ 1.5  2.   2.  -8.89 ] 
    [ 2.   0.  -2.5  13.26 ] 
    [ 2.   0.   1.5  -9.81 ] 
    [ 2.5  2.   0.5  -1.60 ] 
    [ 2.5  2.   1.  -3.48 ] 
    [ 2.5  2.   2.  -5.20 ]]  

b比更小的(比方说15分),并具有相同类型的如上[x y z val]其中VAL这里不为零。

现在我需要为a插入对应的x,y,z的b的val。这意味着对于等价的[x y z]点,我需要将val的值从b替换为a。哪个会修改列表a。

+1

只是确保...都XYZ设置为'a'唯一,与'b'相同? – 2012-01-05 16:52:18

+1

这些看起来像NumPy阵列。所有的点都是独特的吗?你需要使用列表/数组吗? – 2012-01-05 16:52:58

回答

1

假设Python语法,你可以尝试这样的事:

mini_list_a = [(x,y,z) for x,y,z,_ in a] 
for x,y,z,val in b: 
    a[mini_list_a.index((x,y,z))] = [x,y,z,val] 
+0

我会用'迷你'部分的字典。快速查找:'dict_a = dict((tuple(row [: - 1]),n)for n,列举(a)中的行)',然后'a [dict_a((x,y,z)), -1] = val' – 2012-01-05 17:06:36

1

你有没有考虑将值存储在dict,使用的X,Y元组和Z为重点?

所以你必须:

a = { (0. , 0. , -2.5) : 0. , 
     (0. , 0. , -2.) : 0. , 
     (0. , 0. , -1.5) : 0. , 
     ... 

如果您b在同一格式的dict,更新a是简单的:

a.update(b) 
+0

只要OP并不真的需要数据为数组格式,我认为这将是一条路。 – 2012-01-05 17:07:33

0
index_to_a = dict((tuple(row[:3]),row) for row in a) 
for x,y,z,val in b: 
    index_to_a[x,y,z][3] = val 
1

如果X,Y, z和val是列表项(用逗号分隔)

a = [[ 0, 0, -2.5, 0 ] 
    [ 0, 0, -2, 0 ] 
    [ 0, 0, -1.5, 0 ]] 

b = [[ 0,   0,  -2.5,  21.793416 ] 
    [ 0,   0.5,  -2.5,  20.30 ] 

for item in a: 
    s = filter(lambda x: (x[0]==item[0]and x[1]==item[1] and x[2]==item[2]),b) 
    if s: 
     item[3] = s[0][3] 

使用filter,您可以在b中搜索x,y,z triple,如果找到,则将最后一个项目(value)设置为a中所选项目的第3个值。

1

假设ab是numpy的数组,你可以做这样的:

from itertools import imap, izip 
index_map = dict(izip(
        imap(tuple, a[:,0:3].tolist()), 
        xrange(len(a)))) 

for row in b: 
    loc = index_map.get(tuple(row[0:3])) 
    if loc is not None: 
     a[loc, 3] = row[3] 

做之后从上述值:

>>> a 
array([[ 0.  , 0.  , -2.5  , 21.793416], 
     [ 0.  , 0.  , -2.  , 0.  ], 
     [ 0.  , 0.  , -1.5  , 0.  ], 
     [ 2.5  , 2.  , 1.  , -3.48 ], 
     [ 2.5  , 2.  , 1.5  , 0.  ], 
     [ 2.5  , 2.  , 2.  , -5.2  ]]) 
相关问题