我希望在numpy 2-D数组中对所有2x2块应用函数。我怎么能这样做?],
例如:
输入数组:
[[A(0,0), A(0,1), ... A(0,n-1)],
[A(1,0), A(1,1), ... A(1,n-1)],
...
[A(m-1,0), A(m-1,1), ... A(m-1, n-1)]]
其中(n%2 == 0)和(m%2 == 0)
我希望将以下函数(fox示例)应用于此输入数组:
C1*A(x,y) + C2*A(x+1,y) - C3*A(x,y+1) - C4*A(x+1,y+1)
其中(x = 2i,y = 2j,0 <= x <= m / 2,0 <= j <= n / 2)
输出应为(m / 2)x(n / 2)数组。
谢谢
答案 0 :(得分:2)
import numpy as np
a = np.arange(16).reshape((4,4))
c1=c2=c3=c4=1
print a
print c1*a[::2,::2] + c2*a[1::2,::2] - c3*a[::2,1::2] - c4*a[1::2,1::2]
输出:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[-2 -2]
[-2 -2]]
答案 1 :(得分:1)
scipy.ndimage.filters.generic_filter几乎就是你想要的。它将重叠他们所谓的“足迹”,你想要一个非重叠的版本。你可以做的是使用generic_filter进行计算,然后使用子集来获得你想要的数组。
你不提供示例数据,所以我会做一些......
import numpy as np
import scipy.ndimage
def myfilter(footprint_vals, c1, c2, c3, c4):
return sum(np.array([c1, c2, -c3, -c4]) * footprint_vals)
footprint = [[False, True, False],
[True, False, True],
[False, True, False]]
old_array = np.arange(120).reshape((6,20))
c1 = 2
c2 = 4
c3 = 2
c4 = 8
new_array = scipy.ndimage.filters.generic_filter(old_array, myfilter,
footprint=footprint, extra_arguments=(c1,c2,c3,c4))
那应该让你接近......
答案 2 :(得分:0)
我猜你想要什么,因为你的问题不是很清楚。我假设您想要将输入作为数组中的位置调用函数,并将输出应用于数组中的该位置。可能有更好的方法可以做到这一点,但这就是我想到的最重要的事情。
a = arange(4).reshape(2,2)
for row in range(a.shape[0]):
for col in range(a.shape[1]):
a[row,col] = 0 #exchange this for any function you want
答案 3 :(得分:0)
我认为你的意思是在两个轴上都是平面尺寸的二维数组?
您可以将每个2x2块放入如下所示的行:
a = np.arange(100).reshape((10,10))
a2 = np.hstack((a[::2].reshape((-1,2)), a[1::2].reshape((-1,2))))
然后应用这样的函数:
np.sum(a2, axis=1)
编辑:应用问题中添加的功能
c = np.array([C1,C2,-C3,-C4])
a3 = np.sum(a2 * c, axis=1)
a3.reshape(np.array(a.shape) / 2)