无法正确索引NUMPY数组列表

时间:2013-07-08 16:57:29

标签: python arrays numpy indexing

我有一个大型数组列表。每个数组都包含数据。我还有另一个平均数组,其中每行包含每个数据数组的平均值。对于数据数组中的每一行,我想减去该行的平均值。我想要的一个较小的例子如下所示:

data = [array([[ 13.964,  13.983,  14.03 , 13.788,  13.771,  13.781], 
               [ 13.845,  13.854,  13.896, 13.688,  13.657,  13.675]]),
        array([[ 14.182,  14.184,  14.223, 14.006,  13.991,  14.001],
               [ 14.216,  14.231,  14.271, 14.042,  14.023,  14.035]]),
        array([[ 15.717,  15.761,  15.812, 15.488,  15.444,  15.489],
               [ 15.861,  15.943,  15.995, 15.64 ,  15.613,  15.62 ]])]

avgs = array([[ 13.9045,  13.9185,  13.963 ,  13.738 ,  13.714 ,  13.728 ],
              [ 14.199 ,  14.2075,  14.247 ,  14.024 ,  14.007 ,  14.018 ],
              [ 15.789 ,  15.852 ,  15.9035,  15.564 ,  15.5285,  15.5545]])

我想要产生的是:(这是一个非常简单的例子,每个数组只有两行,但实际上我想从各种数据数组中的每一行中减去数组的平均值。)

subtracted_data = [array([[ 0.0595,  0.0645,  0.067 ,  0.05  ,  0.057 ,  0.053 ],
                          [-0.0595, -0.0645, -0.067 , -0.05  , -0.057 , -0.053 ]]),
                   array([[-0.017 , -0.0235, -0.024 , -0.018 , -0.016 , -0.017 ],
                          [ 0.017 ,  0.0235,  0.024 ,  0.018 ,  0.016 ,  0.017 ]])
                   array([[-0.072 , -0.091 , -0.0915, -0.076 , -0.0845, -0.0655],
                          [ 0.072 ,  0.091 ,  0.0915,  0.076 ,  0.0845,  0.0655]])]

我试着这样做:

subtracted_data = [[]]*len(data)
for i in range(len(data)):
    for j in data[i]:
        subtracted_data[i].append(data[i][j] - avgs[i])

没有成功。我想知道我是否正确接近这一点。

2 个答案:

答案 0 :(得分:4)

更好的做法当然是没有数组列表,而是更高维数组。在你的情况下:

>>> data = np.array(data)
>>> data.shape
(3L, 2L, 6L)
>>> avgs.shape
(3L, 6L)
>>> data - avgs[:, None, :]
array([[[ 0.0595,  0.0645,  0.067 ,  0.05  ,  0.057 ,  0.053 ],
        [-0.0595, -0.0645, -0.067 , -0.05  , -0.057 , -0.053 ]],

       [[-0.017 , -0.0235, -0.024 , -0.018 , -0.016 , -0.017 ],
        [ 0.017 ,  0.0235,  0.024 ,  0.018 ,  0.016 ,  0.017 ]],

       [[-0.072 , -0.091 , -0.0915, -0.076 , -0.0845, -0.0655],
        [ 0.072 ,  0.091 ,  0.0915,  0.076 ,  0.0845,  0.0655]]])

答案 1 :(得分:1)

下面:

>>> subtracted_data = np.empty_like(data)
>>> for i in range(len(data)):
...     subtracted_data[i] = data[i] - avgs[i]
... 
>>> subtracted_data
array([[[ 0.0595,  0.0645,  0.067 ,  0.05  ,  0.057 ,  0.053 ],
        [-0.0595, -0.0645, -0.067 , -0.05  , -0.057 , -0.053 ]],

       [[-0.017 , -0.0235, -0.024 , -0.018 , -0.016 , -0.017 ],
        [ 0.017 ,  0.0235,  0.024 ,  0.018 ,  0.016 ,  0.017 ]],

       [[-0.072 , -0.091 , -0.0915, -0.076 , -0.0845, -0.0655],
        [ 0.072 ,  0.091 ,  0.0915,  0.076 ,  0.0845,  0.0655]]])

或者作为一个单行:

>>> subtracted_data = np.array([data[i] - avgs[i] for i in range(len(data))])

最后,如果您以后不需要中间平均值:

>>> subtracted_data = np.array([x - np.mean(x, 0) for x in data])