如何在2D numpy数组中的所有2x2块上应用函数

时间:2014-01-05 05:46:53

标签: python numpy

我希望在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)数组。

谢谢

4 个答案:

答案 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)