我在安排和替换python列表或数组方面遇到了问题。 我有两个数组,比如a和b as,
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小于a(比方说15分)并且具有与上面[x y z val]
相同的类型,其中 val 在这里不为零。
现在我需要将b
的val插入到a
的相应x,y,z中。这意味着对于等效的[x y z]点,我需要将val的值从b替换为a。哪个会修改列表a。
答案 0 :(得分: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]
答案 1 :(得分: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)
答案 2 :(得分: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 三元组,如果找到,则将最后一项(值)设置为a中所选项目的第三个值
答案 3 :(得分:1)
假设a
和b
是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 ]])
答案 4 :(得分: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