【问题标题】:Python - Element-wise means of multiple matrices with NumpyPython - 使用 Numpy 的多个矩阵的元素方式
【发布时间】:2013-09-20 12:12:40
【问题描述】:

我正在实现一个滑动窗口模型,我想将一个矩阵 @t 初始化为前 N 个矩阵的元素方式,其中 N 是窗口大小。 这是我最初的尝试,它显示了最后 N 个矩阵:

list_of_arrays = [np.array([]) for i in range(3)]
N=2 # window size
# past 3 matrices
list_of_arrays[0] = np.array([[0.1,0.2],[0.3,0.4]])
list_of_arrays[1] = np.array([[0.5,0.6],[0.7,0.8]])
list_of_arrays[2] = np.array([[0.9,1.0],[1.1,1.2]])

# at t=3, get element-wise means of previous N matrices
t=3
range1 = lambda start, end: range(start, end+1) # modified range function
answer = [list_of_arrays[t-j] for j in range1(1,N)]

期望的答案是过去 N 个矩阵的元素均值。对于上面的系列,它是:

(list_of_arrays[2]+list_of_arrays[1]) / 2 = [[0.7,0.8],[0.9,1.0]]

我应该如何修改answer 行上的列表理解以获得所需的答案?

【问题讨论】:

    标签: python numpy list-comprehension mean sliding-window


    【解决方案1】:

    t-Nt(含)的元素均值由下式给出

    np.mean(list_of_arrays[t-N+1:t+1], axis=0)
    

    在您问题的字里行间,我认为您想在取平均值之前做一些其他的调整。假设您的列表包含包含 numpy 数组的对象(如您在评论中建议的 .matrix 属性),那么列表推导可以提取相关部分,因此对上述内容进行以下修改:

    np.mean([a.matrix for a in list_of_arrays[t-N+1:t+1]], axis=0)
    

    【讨论】:

    • 谢谢,我需要列表理解,因为矩阵是对象字段,即 object[1].matrix、object[2].matrix 等。我无法以 list_of_arrays[-N:].matrix 的身份访问它们。但我不是 Python 专家,所以如果列表理解仍然可以避免,请告诉我。
    • 好吧,给定你的代码,上面的工作正常(现在修改为给出从 t-N 到 t 的平均值)。您的列表元素是否与您描述的不同?
    • 列表元素是包含矩阵的对象。因此我无法直接访问这些矩阵。换句话说,它是一个由包含矩阵的对象组成的列表。这就是我使用列表理解的原因(单独访问每个对象的矩阵,然后完全处理它们 - 正如您的回答中所给出的那样。)
    • 所以你的问题不正确?问题是您描述了列表理解是错误(非)解决方案的情况。您所指的这些对象是什么?矩阵元素是一个 numpy 矩阵对象,还是别的什么?
    【解决方案2】:

    我想通了。这是对问题中指示的answer 行的必要修改:

    answer = np.mean([list_of_arrays[t-j] for j in range1(1,N)], axis = 0)
    >> array([[ 0.7,  0.8],
    >>        [ 0.9,  1. ]])
    

    【讨论】:

    • 你的问题和答案对除了你自己以外的每个人都是毫无用处的。主要是因为您没有尝试表达实际 问题是什么。从字里行间看,您似乎正在使用 numpy 数组作为您拥有的实际对象的概念代理,然后您希望有人告诉您如何做一些您实际要求的事情。请做出一点努力,以反映您实际问题的方式表达自己,不要假设人们可以读懂您的想法。就目前而言,考虑到这个问题如此不受欢迎,这个答案很差。
    • 问题:我应该如何modify the list comprehension on the answer line 得到想要的答案?这完全封装了我正在寻找的东西。没有什么神秘或误导性的。你在任何时候都不需要读懂我的想法。
    • 但是你接着说“对于上面的系列来说它是……”然后呈现最明显不是你说你想要的东西。如果您按照描述处理 numpy 数组,则不需要列表理解(实际上,这是一个非常糟糕的答案)。如果您正在处理其他事情,请写下问题以反映这一点。您的列表理解只是在这里您的答案中的切片器。
    • @HenryGomersall 你大错特错了。我只是将这个答案用于我自己的项目,它很有用。像你这样认真对待 stackexchange 的人,才是伟大人物被封杀的原因。
    • @DLV 对你有好处。对于一个糟糕的问题,它仍然是一个糟糕的答案,但如果你想在你的代码中实现它,那么不要让我阻止你。列表理解在上面的答案中完全是多余的(将其替换为list_of_arrays[-N:])。问题是尚不清楚这是否足以解决一般问题。解决编程问题的方法有很多,但大多数都是不好的。在这种情况下,考虑到问题,固定在列表理解上会导致糟糕的解决方案,即使它有效。此外,“像我这样的人”修复了问题代码中的实际错误。
    【解决方案3】:

    这是另一个答案。

    N = 3 # window size
    m = np.array([
            [[0, 10], 
             [0, 0]], 
            [[0, 0], 
             [1, 1.]],
            [[0, 0], 
             [0, 1.]],
            [[0, 5], 
             [0, 0]],
            [[0, 10], 
             [0, 0]]])
    print m.shape
    for t in range(m.shape[0]-N):
        print '\nwindow:', t, 'to', t+N-1
        print m[t:t+N,:,:].shape
        print m[t:t+N,:,:].sum(axis=0)/(N)
    

    输出是

    (5, 2, 2)
    
    window 0 to 2
    (3, 2, 2)
    [[ 0.          3.33333333]
     [ 0.33333333  0.66666667]]
    
    window: 1 to 3
    (3, 2, 2)
    [[ 0.          1.66666667]
     [ 0.33333333  0.66666667]]
    

    【讨论】:

      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多