使用索引将值插入2D Python列表

时间:2017-12-14 01:25:58

标签: python arrays list indexing 2d

我正在尝试将几个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

1 个答案:

答案 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]

使用切片可能更具声明性和清晰度。希望这会有所帮助!