Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用减号函数比较单元格数组_Python_Arrays_Numpy_Combinations_Cell Array - Fatal编程技术网

Python:使用减号函数比较单元格数组

Python:使用减号函数比较单元格数组,python,arrays,numpy,combinations,cell-array,Python,Arrays,Numpy,Combinations,Cell Array,我有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

我有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创建允许我减去单元格数组的移位窗口。

您可以使用中的函数来执行移位窗口:

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

我认为这对函数符合您的要求。第一种可能需要一些调整,以正确地配对差异

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))
制作(用一些漂亮的印刷品):

将我的答案与你的答案相比较,我想知道,你是否用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\u tricks.as\u stride
中还有一个整洁的
striding
技巧。但我怀疑这是否会节省时间,尤其是在这样的小例子中。

我只会将
a
b
c
视为数组列表,甚至列表列表,并反复讨论各种可能性。这里没有要“矢量化”的内容。每个数组的长度是不同的。我在matlab中有我的代码,但它需要更长的时间来运行,我在matlab中面临内存不足的错误。所以我认为python可能比matlab在更短的时间内解决这个问题。谢谢你的回复。这真的很有帮助。
for i in range(0,1+m-n):
    result.append(b[i:i+n]-a)