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]])
假设我有一个数组 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]])