列表切片列表在Python中

时间:2017-11-07 23:11:04

标签: python arrays list numpy

我在120个月内为4个变量模拟了10000个场景。 因此,我有一个列表的列表,列表的列表和元素我将不得不使用方案[1] [1] [1],这将给我一个浮点数。

我希望将其分成两部分,除以第二个列表。这意味着我想在前60个月保留4个变量的10000个场景。

我将如何做到这一点?

我的直觉会告诉我做

scenarios[:][0:60]

但这不起作用。它不是削减第二个清单,而是削减第一个清单。有什么问题?

示例:

Q = data.cov().as_matrix()   # monthly covariance matrix Q                                                                                            
r=[0.00565,0.00206,0.00368,0.00021] # monthly return 

scenarios = [[]]*10000
for i in range(10000):
    scenarios[i] = np.random.multivariate_normal(r, Q, size = 120) # monthly scenarios

就我而言,Q =

2.167748064990633258e-03    -8.736421379048196659e-05   1.457397098602368978e-04    2.799384719379381381e-06
-8.736421379048196659e-05   9.035930360181909865e-04    3.196576120840064102e-04    3.197146643002681875e-06
1.457397098602368978e-04    3.196576120840064102e-04    2.390042779951682440e-04    2.312645986876262622e-06
2.799384719379381381e-06    3.197146643002681875e-06    2.312645986876262622e-06    4.365866475269951553e-06

4 个答案:

答案 0 :(得分:2)

使用列表理解:

early_scenarios = [x[:60] for x in scenarios]

答案 1 :(得分:2)

因此,您尝试在Python list对象上使用多维切片,但从根本上说,list个对象没有维度。除了总数之外,他们对其内容没有固有的了解。但是,你*根本不应该使用list个对象!相反,替换它:

scenarios = [[]]*10000
for i in range(10000):
    scenarios[i] = np.random.multivariate_normal(r, Q, size = 120) # monthly scenarios

有了这个:

scenarios = np.random.multivariate_normal(r, Q, size=(1000, 120))

在REPL中:

>>> scenarios = np.random.multivariate_normal(r, Q, size=(1000, 120))
>>> scenarios.shape
(1000, 120, 4)

然后,您可以使用以下方法切割N维中的内容:

scenarios[:, 0:60]

或者,一个更有用的切片:

>>> scenarios[500:520, 0:60]
array([[[-0.05785267,  0.01122828,  0.00786622, -0.00204875],
        [ 0.01682276,  0.00163375,  0.00439909, -0.0022255 ],
        [ 0.02821342, -0.01634708,  0.01175085, -0.00194007],
        ...,
        [ 0.04918003, -0.02146014,  0.00071328, -0.00222226],
        [-0.03782566, -0.00685615, -0.00837397, -0.00095019],
        [-0.06164655,  0.02817698,  0.01001757, -0.00149662]],

       [[ 0.00071181, -0.00487313, -0.01471801, -0.00180559],
        [ 0.05826763,  0.00978292,  0.02442642, -0.00039461],
        [ 0.04382627, -0.00804489,  0.00046985,  0.00086524],
        ...,
        [ 0.01231702,  0.01872649,  0.01534518, -0.0022179 ],
        [ 0.04212831, -0.05289387, -0.03184881, -0.00078165],
        [-0.04361605, -0.01297212,  0.00135886,  0.0057856 ]],

       [[ 0.00232622,  0.01773357,  0.00795682,  0.00016406],
        [-0.04367355, -0.02387383, -0.00448453,  0.0008559 ],
        [ 0.01256918,  0.06565425,  0.05170755,  0.00046948],
        ...,
        [ 0.04457427, -0.01816762,  0.00068176,  0.00186112],
        [ 0.00220281, -0.01119046,  0.0103347 , -0.00089715],
        [ 0.02178122,  0.03183001,  0.00959293, -0.00057862]],

       ...,
       [[ 0.06338153,  0.01641472,  0.01962643, -0.00256244],
        [ 0.07537754, -0.0442643 , -0.00362656,  0.00153777],
        [ 0.0505006 ,  0.0070783 ,  0.01756948,  0.0029576 ],
        ...,
        [ 0.03524508, -0.03547517, -0.00664972, -0.00095385],
        [-0.03699107,  0.02256328,  0.00300107,  0.00253193],
        [-0.0199608 , -0.00536222,  0.01370301, -0.00131981]],

       [[ 0.08601913, -0.00364473,  0.00946769,  0.00045275],
        [ 0.01943327,  0.07420857,  0.00109217, -0.00183334],
        [-0.04481884, -0.02515305, -0.02357894, -0.00198166],
        ...,
        [-0.01221928, -0.01241903,  0.00928084,  0.00066379],
        [ 0.10871802, -0.01264407,  0.00601223,  0.00090526],
        [-0.02603179, -0.00413112, -0.006037  ,  0.00522712]],

       [[-0.02929114,  0.02188803, -0.00427137,  0.00250174],
        [ 0.02479416, -0.01470632, -0.01355196,  0.00338125],
        [-0.01915726, -0.00869161,  0.01451885, -0.00137969],
        ...,
        [ 0.05398784, -0.00834729, -0.00437888,  0.00081602],
        [ 0.00626345, -0.0261016 , -0.01484753,  0.00060499],
        [ 0.05427697,  0.04006612,  0.03371313, -0.00203731]]])
>>>

答案 2 :(得分:1)

Python切片不会像这样考虑所有维度。您的表达式会复制整个列表scenarios[:],然后获取副本的前60个元素。你需要写一个理解来抓住你想要的元素。 也许

[scenarios[x][y][z] 
    for x in range(len(scenarios))
        for y in range(60)
            for z in range(len(scenarios[0][0])) ]

答案 3 :(得分:1)

您需要在循环或列表推导中显式切片每个辅助列表。我构建了一个10x10的列表集,因此您必须更改索引以适合您的问题:

x = []
for a in range(10):
    x.append([10*a+n for n in range(10)])
# x is now a list of 10 lists, each of which has 10 elements
print(x)
x1 = [a[:5] for a in x]
# x1 is a list of containing the low elements of the secondary lists
x2 = [a[5:] for a in x]
# x2 is a list containing the high elements of the secondary lists
print(x1, x2)