【问题标题】:Python: Cell arrays comparison using minus functionPython:使用减号函数比较元胞数组
【发布时间】:2015-06-06 03:52:18
【问题描述】:

我有 3 个单元阵列,每个单元阵列有不同大小的阵列。如何为每个可能的单元阵列组合执行减法函数?

例如:

import numpy as np
a=np.array([[np.array([[2,2,1,2]]),np.array([[1,3]])]])
b=np.array([[np.array([[4,2,1]])]])
c=np.array([[np.array([[1,2]]),np.array([[4,3]])]])

这里可能的组合是 a-b、a-c 和 b-c。
比方说 a - b:

a=2,2,1,2 and 1,3

b=4,2,1


由于不同大小的数组,所需的结果伴随着窗口移动:

(2,2,1)-(4,2,1) ----> -2,0,0
(2,1,2)-(4,2,1) ----> -2,-1,1
(1,3)  -(4,2)   ----> -3,1,1
(1,3)  -(2,1)   ----> 4,-1,2

我想知道如何使用 python 创建移动窗口,让我可以减去我的单元格数组。

【问题讨论】:

  • 我只会将abc 视为数组列表,甚至是列表列表,并遍历所有可能性。这里没有什么可以“矢量化”的。

标签: python arrays numpy combinations cell-array


【解决方案1】:

您可以使用toolz library中的函数sliding_window()来做移位窗口:

>>> import numpy as np
>>> import toolz
>>> a = np.array([2,2,1,2])
>>> b = np.array([4, 2, 1])
>>> for chunk in toolz.sliding_window(b.size, a):
   ...:         print(chunk - b)
   ...:     
[-2  0  0]
[-2 -1  1]

【讨论】:

    【解决方案2】:

    我认为这对功能可以满足您的需求。第一个可能需要一些调整才能正确配对差异。

    import numpy as np
    
    def diffs(a,b):
        # collect sliding window differences
        # length of window determined by the shorter array
        # if a,b are not arrays, need to replace b[...]-a with
        # a list comprehension
        n,m=len(a),len(b)
        if n>m:
            # ensure s is the shorter
            b,a=a,b # switch
            n,m=len(a),len(b)
            # may need to correct for sign switch
        result=[]
        for i in range(0,1+m-n):
            result.append(b[i:i+n]-a)
        return result
    
    def alldiffs(a,b):
        # collect all the differences for elements of a and b
        # a,b could be lists or arrays of arrays, or 2d arrays
        result=[]
        for aa in a:
            for bb in b:
                result.append(diffs(aa,bb))
        return result
    
    # define the 3 arrays
    # each is a list of 1d arrays
    
    a=[np.array([2,2,1,2]),np.array([1,3])]
    b=[np.array([4,2,1])]
    c=[np.array([1,2]),np.array([4,3])]
    
    # display the differences
    print(alldiffs(a,b))
    print(alldiffs(a,c))
    print(alldiffs(b,c))
    

    制作(带有一些漂亮的印刷品):

    1626:~/mypy$ python stack30678737.py 
    [[array([-2,  0,  0]), array([-2, -1,  1])], 
     [array([ 3, -1]), array([ 1, -2])]]
    
    [[array([1, 0]), array([ 1, -1]), array([0, 0])], 
     [array([-2, -1]), array([-2, -2]), array([-3, -1])], 
     [array([ 0, -1])], [array([3, 0])]]
    
    [[array([3, 0]), array([ 1, -1])], 
     [array([ 0, -1]), array([-2, -2])]]
    

    比较我的回答和你的回答,我想知道,你是否用 0 填充较短的数组,所以结果总是 3 个元素长?

    a 更改为a=[np.array([2,2,1,2]),np.array([0,1,3]),np.array([1,3,0])]

    产生:

    [[array([-2,  0,  0]), array([-2, -1,  1])], 
     [array([ 4,  1, -2])], [array([ 3, -1,  1])]]
    

    我想你可以用这个内部循环做一些更有趣的事情:

    for i in range(0,1+m-n):
        result.append(b[i:i+n]-a)
    

    但是为什么呢?首要任务是明确问题规范。速度可以等。除了图像包中的滑动窗口代码之外,np.lib.stride_tricks.as_strided 中还有一个巧妙的striding 技巧。但我怀疑这是否会节省时间,尤其是在像这样的小例子中。

    【讨论】:

    • 每个数组的长度不同。我在 matlab 中有我的代码,但是运行时间更长,并且我在 matlab 中遇到了内存不足的错误。所以我认为与 matlab 相比,python 可能会在更短的时间内解决这个问题。谢谢回复。真的很有帮助。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多