简体   繁体   English

列表切片列表在Python中

[英]List of List of List slicing in Python

I have simulated 10000 scenarios for 4 variables during 120 months. 我在120个月内模拟了4个变量的10000个场景。 Hence, I have a scenarios list of lists of lists on which to get and element I would have to use scenarios[1][1][1], for example, and this would give me a float. 因此,我有一个列表的列表,列表的列表和元素我将不得不使用方案[1] [1] [1],这将给我一个浮点数。

I want to slice this in two, dividing by the second list. 我想把它切成两半,除以第二个列表。 Which means I want to keep the 10000 scenarios for 4 variables for the first 60 months. 这意味着我想在前60个月保留4个变量的10000个场景。

How would I go about doing this? 我该怎么做呢?

My intuition would tell me to do 我的直觉会告诉我这样做

scenarios[:][0:60]

but this does not work. 但这不起作用。 Instead of cutting the second list, it cuts the first. 它不是削减第二个清单,而是削减第一个清单。 What is wrong? 怎么了?

Example: 例:

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

In my case, Q= 就我而言,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

使用列表理解:

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

So, you are trying to use multidimensional slicing on Python list objects, but fundamentally, list objects do not have dimensions . 因此,您尝试在Python list对象上使用多维切片,但从根本上说, list对象没有维度 They have no inherent knowledge of their contents, other than the total number of them. 除了总数之外,他们对其内容没有固有的了解。 But, you *shouldn't be working with list objects at all! 但是,你*根本不应该使用list对象! Instead, replace this: 相反,替换这个:

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

With this: 有了这个:

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

In a REPL: 在REPL中:

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

Then, you can slice to your heart's content in N dimensions using: 然后,您可以使用以下方法切割N维中的内容:

scenarios[:, 0:60]

Or, a more wieldy slice: 或者,一个更有用的切片:

>>> 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]]])
>>>

Python slicing doesn't consider all dimension like this. Python切片不会像这样考虑所有维度。 Your expression makes a copy of the entire list, scenarios[:] , and then takes the first 60 elements of the copy. 您的表达式复制整个列表, scenarios[:] ,然后获取副本的前60个元素。 You need to write a comprehension to grab the elements you want. 你需要写一个理解来抓住你想要的元素。 Perhaps 也许

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

You need to explicitly slice each secondary list, either in a loop or in list comprehensions. 您需要在循环或列表推导中显式地对每个辅助列表进行切片。 I built a 10x10 set of lists so you have to change the indexing to fit your problem: 我构建了一个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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM