Numpy在一个点数组的基础上创建另外四个点数组

Numpy create four other points arrays based on one point array

假设我有一个数组 a 代表 3 个矩形的 3 个中心点。我想根据数组 a 中的每个点创建四个其他复制点,方法是在 x、y 坐标中添加 1 或减去 1,如图所示。

a = np.arange(9).reshape(3,3)
>>>a
>>>out:[[ 0  1  2]
        [ 3  4  5]
        [ 6  7  8]]

我是 numpy 的新手。我能想到的是,我可以做 4 次 a,因为 首先 a[:,0]+=1,然后 a[:,1]+=1。对于第二个a[:,0]+=1,然后a[:,1]-=1。对于第三个a[:,0]-=1然后a[:,1]+=1,对于第四个a[:,0]-=1然后a[:,1]-=1。但我知道这很愚蠢。所以我想知道在 numpy 中是否有更清晰的方法来做到这一点? 我的预期产出:

array_1 = [[ 1  2  2]
           [ 4  5  5]
           [ 7  8  8]]
array_2 = [[ 1  0  2]
           [ 4  3  5]
           [ 7  6  8]]
array_3 = [[ -1  2  2]
            [ 2  5  5]
            [ 5  8  8]]
array_4 = [[ -1  0  2]
            [ 2  3  5]
            [ 5  6  8]]

看来你需要的是循环笛卡尔积,有很多方法,一种是使用itertools,这里是:

import numpy as np
import itertools

a = np.arange(9).reshape(3,3)

list_of_arrays = []
for seq in itertools.product([1, -1], repeat=2):
    b = a.copy() 
    b[:,0]+=seq[0]
    b[:,1]+=seq[1]
    list_of_arrays.append(b)

list_of_arrays:

[数组([[1, 2, 2], [4, 5, 5], [7, 8, 8]]), 数组([[1, 0, 2], [4, 3, 5], [7, 6, 8]]), 阵列([[-1, 2, 2], [ 2, 5, 5], [ 5, 8, 8]]), 数组([[-1, 0, 2], [ 2, 3, 5], [ 5, 6, 8]])]

使用 numpy 广播和 itertools 生成班次:

import itertools
import numpy as np

a = np.arange(9).reshape(3, 3)

shifts = np.array([(dx, dy, 0) for dx, dy in itertools.product([1, -1], repeat=2)])
shifted_a = a + shifts[:, None]

您可以生成 3D 数组:

a = np.arange(9).reshape(3,3)

b = np.array([[ 1, 1,0],
              [ 1,-1,0],
              [-1, 1,0],
              [-1,-1,0]])

# or programmatically
from itertools import product 
b = np.array(list(product([1,-1], [1,-1], [0])))


out = np.tile(a, (4,1,1))+b[:,None,:]

array([[[ 1,  2,  2],
        [ 4,  5,  5],
        [ 7,  8,  8]],

       [[ 1,  0,  2],
        [ 4,  3,  5],
        [ 7,  6,  8]],

       [[-1,  2,  2],
        [ 2,  5,  5],
        [ 5,  8,  8]],

       [[-1,  0,  2],
        [ 2,  3,  5],
        [ 5,  6,  8]]])

子集:

out[0]

array([[1, 2, 2],
       [4, 5, 5],
       [7, 8, 8]])