Python:使用负函数比较元胞数组
Python: Cell arrays comparison using minus function
我有 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
由于数组大小不同,需要的结果随着 windows 的移动而出现:
(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 创建移位 window 让我减去我的元胞数组。
您可以使用函数 sliding_window()
from the toolz library 进行移位 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]
我认为这对功能可以满足您的需求。第一个可能需要一些调整才能正确配对差异。
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)
但是为什么呢?首要任务是弄清楚问题规格说明。速度可以等。除了在图像包中滑动 window 代码外,np.lib.stride_tricks.as_strided
中还有一个巧妙的 striding
技巧。但我怀疑这是否会节省时间,尤其是在像这样的小例子中。
我有 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
由于数组大小不同,需要的结果随着 windows 的移动而出现:
(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 创建移位 window 让我减去我的元胞数组。
您可以使用函数 sliding_window()
from the toolz library 进行移位 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]
我认为这对功能可以满足您的需求。第一个可能需要一些调整才能正确配对差异。
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)
但是为什么呢?首要任务是弄清楚问题规格说明。速度可以等。除了在图像包中滑动 window 代码外,np.lib.stride_tricks.as_strided
中还有一个巧妙的 striding
技巧。但我怀疑这是否会节省时间,尤其是在像这样的小例子中。