我正在尝试将几个python列表(即2D列表)中的值一次插入到另一个2D列表中。 (我知道numpy在这方面做得更好,但我试图将列表的性能与numpy进行比较,所以请不要只是建议numpy。)我想在特定位置插入值,因此左侧的索引。
resampled_pix_spot_list是240 x 240列表列表,pix_spot_list是225 x 225列表列表。
我得到的错误,从示例中的最后四行,是“TypeError:'float'对象不可订阅”。我得到pix_prod_bl [0] [0],例如,是一个浮点数,但我不明白为什么我不能将它插入resampled_pix_spot_list中的一组特定索引。
编辑1-添加了最小的工作示例。
编辑2-在添加工作示例时,我发现我不小心对该行进行了评论,我将列表转换回numpy,并且不知何故我误解了Spyder控制台有关错误源自何处。无论如何它现在有效,非常感谢您的快速反馈。我想我会留在这里,以防它对其他人有帮助。
编辑3- pix_spot_values是一个数据数组,因此只需一个0到1之间的随机浮点数就足够了。
xc=57
yc=189
rebin=15
# fraction pixel offset requiring interpolation
dx=xc*rebin-int(np.floor(xc*rebin)) # positive value between 0 and 1
dy=yc*rebin-int(np.floor(yc*rebin)) # positive value between 0 and 1
# weights for interpolation
w00=(1-dy)*(1-dx)
w10=dy*(1-dx)
w01=(1-dy)*dx
w11=dy*dx
# now the rest of the offset is an integer shift
dx=int(np.floor(xc*rebin))-int(np.floor(xc))*rebin # positive integer between 0 and 14
dy=int(np.floor(yc*rebin))-int(np.floor(yc))*rebin # positive integer between 0 and 14
def new_pix_spot(w00, w10, w01, w11, pix_spot_list, ny_spot, nx_spot, rebin, dy, dx):
#first change numpy array to list
pix_spot_list=pix_spot_values.tolist()
#preallocate array of zeros
resampled_pix_spot_list=[[0 for x in range (ny_spot + rebin)] for y in range(nx_spot+rebin)]
#create 2D lists
pix_prod_bl = [[x*w00 for x in y] for y in pix_spot_list]#bottom left
pix_prod_br = [[x*w10 for x in y] for y in pix_spot_list]#bottom right
pix_prod_tl = [[x*w01 for x in y] for y in pix_spot_list]#top left
pix_prod_tr = [[x*w11 for x in y] for y in pix_spot_list]#top right
for i in range (len(pix_spot_list)):
for j in range (len(pix_spot_list)):
k=dy + i
m=dx + j
n=dy + 1 + i
p=dx + 1 + i
resampled_pix_spot_list[k][m] += pix_prod_bl[i][j] #bottom left
resampled_pix_spot_list[n][m] += pix_prod_br[i][j] #bottom right
resampled_pix_spot_list[k][p] += pix_prod_tl[i][j] #top left
resampled_pix_spot_list[n][p] += pix_prod_tr[i][j] #top right
resampled_pix_spot_values = np.array(resampled_pix_spot_list)
return resampled_pix_spot_values
答案 0 :(得分:0)
要将值插入Python中的列表中,必须使用 list 对象(例如resampled_pix_spot_list[0]
)而不是其中的元素(resampled_pix_spot_list[0][0]
,例如您尝试过)。
在Python 2和3中,您都可以使用your_list.insert(<index>, <element>)
(list insertion docs here)插入列表。
因此要在所选坐标的左处插入数字,代码应为:
resampled_pix_spot_list[k].insert(m, pix_prod_bl[i][j])
如果您要替换该位置的像素,则应输入:
resampled_pix_spot_list[k][m] = pix_prod_bl[i][j]
(注意[k]
与[k][m]
。)简而言之:要插入,请与列表交谈;要替换,请与元素交谈。
一个提示:如果您打算重复将值插入列表中的特定位置,请尝试从列表末尾向后迭代。否则,您将不得不调整索引,因为每次.insert()
调用都会将列表的一部分向右移动。
要了解我的意思,让我们假设我有列表[1, 2, 3]
,并希望通过插入操作以[1, 88, 2, 99, 3]
结尾。我们插入的顺序很重要。比较错误的顺序(重复转发):
data = [1, 2, 3]
>>> data.insert(1, 88)
>>> print(data)
[1, 88, 2, 3] # so far so good
>>> data.insert(2, 99)
>>> print(data)
[1, 88, 99, 2, 3] # oops! the first insert changed my indices, so index "2" was wrong!
以正确的顺序(向后迭代):
data = [1, 2, 3]
>>> data.insert(2, 99)
>>> print(data)
[1, 2, 99, 3] # so far so good
>>> data.insert(1, 88)
>>> print(data)
[1, 88, 2, 99, 3] # same insertions + different order = different results!
值得深思的是:Python 2.7和3都允许您使用非常干净的语法替换列表的整个“切片”,这也将帮助您避免“一对一”错误(slice notation docs here) 。例如:
>>> data = [1, 2, 3]
>>> data[1:2] = [88, data[1], 99] # safer, shorter, faster, and clearer
>>> print(data)
[1, 88, 2, 99, 3]
使用切片可能更具声明性和清晰度。希望这会有所帮助!