在任意位置插入列的python方法

2024-06-28 10:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由行列表表示的数据网格:

tableData = [
    [-27.37, 36.61 , 8.90  , -11.20, -36.03, -42.34],
    [16.83 , -33.45, -5.15 , 12.90 , -48.60, -8.70],
    [-19.73, 2.64  , 7.21  , 24.16 , 18.38 , 20.47],
    [-31.05, 15.07 , 42.69 , -32.13, -36.02, 42.31],
    [15.18 , 30.54 , -47.31, 48.38 , 31.60 , -1.98]
]

现在,我想插入两个包含None值的列,例如在列2&3和列4&5之间,这样我就有了以下内容:

tableDataWithNones = [
    [-27.37, 36.61 , None,  8.90  , -11.20, None, -36.03, -42.34],
    [16.83 , -33.45, None,  -5.15 , 12.90 , None,  -48.60, -8.70],
    [-19.73, 2.64  , None,  7.21  , 24.16 , None,  18.38 , 20.47],
    [-31.05, 15.07 , None,  42.69 , -32.13, None,  -36.02, 42.31],
    [15.18 , 30.54 , None,  -47.31, 48.38 , None,  31.60 , -1.98]
]

我可以用双for循环这样做:

spacerPositions = [2, 4]
for i in tableData:
    for j in reversed(spacerPositions):
        i.insert(j, None)

但这并不像是一种Python式的方式。你知道吗

我在想我可以使用numpy来转换数据,这样列就可以变成行,然后我可以使用insert来放入None的行,然后再转换回数据。但是insert不能为索引取多个值,所以我仍然必须使用for循环。你知道吗

有什么办法能让我做得更好吗?你知道吗


Tags: 数据innumpynone网格列表for方式
2条回答

使用^{}

>>> import numpy as np
>>> arr = np.array(tableData)
>>> np.insert(arr, (2, 4), None, axis=1)
array([[-27.37,  36.61,    nan,   8.9 , -11.2 ,    nan, -36.03, -42.34],
       [ 16.83, -33.45,    nan,  -5.15,  12.9 ,    nan, -48.6 ,  -8.7 ],
       [-19.73,   2.64,    nan,   7.21,  24.16,    nan,  18.38,  20.47],
       [-31.05,  15.07,    nan,  42.69, -32.13,    nan, -36.02,  42.31],
       [ 15.18,  30.54,    nan, -47.31,  48.38,    nan,  31.6 ,  -1.98]])

一种非传统的、实用的方法:

from functools import partial

    def insertFunc(data, locs):
        out = []

        for i,d in enumerate(data):
            if i in locs:
                out.append(None)

            out.append(d)

        return out

map(partial(insertFunc,locs=spacerPositions),tableData)

将此与

for i in spacerPositions: 
    for row in tableData: 
        row.insert(i, None)

通过timeit(...,number=10000),我得到:

第一种算法为0.144109010696 第二种算法为0.606826066971

这是有意义的,因为insert是O(n),而append是O(1)。你知道吗

令人惊讶的是,使用numpy为已接受的解决方案计时时:

 timeit.timeit('np.insert(arr,(2,4), None, axis=1)',number=10000,setup='import numpy as np;from __main__ import tableData; arr = np.array(tableData)')

给出0.44481992721557617

相关问题 更多 >