有没有办法使用曼哈顿距离 select Numpy 二维数组的子集?
Is there a way to select a subset of a Numpy 2D array using the Manhattan distance?
例如,我有一个用零填充的 Numpy 二维数组(7 行,7 列):
my_array = numpy.zeros((7, 7))
然后为了论证说我想 select 中间的元素并将其值设置为 1:
my_array[3,3] = 1
现在假设我的曼哈顿距离为 3,我如何将我的数组子集化为仅 select 小于或等于曼哈顿距离(从中间元素开始)的元素和将这些元素设置为 1?最终结果应该是:
我可以遍历二维数组中的每个元素,但不想这样做,因为这太昂贵了,尤其是当我的矩阵非常大且曼哈顿距离非常小时(例如 70x70 矩阵与曼哈顿距离 10).
我会用 meshgrid 创建一个大小为 2,n,n 的辅助矩阵来整理索引,然后减去所需的索引中心,对减去的索引的绝对值求和并进行阈值比较。这里有一些例子
import numpy as np
import matplotlib.pyplot as plt #to draw result
n=70 #size of matrix
distance = 10 #distance
centerCoord = [35,35]
#here i create a mesh matrix of indices
xarr = np.arange(n)
idxMat = np.meshgrid(xarr,xarr) #create a matrix [2,n,n]
pt = np.array(centerCoord).reshape(-1,1,1) #point of size [2,1,1]
elems = np.abs(idxMat-pt).sum(axis=0) <= distance
plt.matshow(elems)
结果:
如果您需要索引,那么调用 np.where
将 return 您 2 个数组 (xindexList,yindexList)
例如,我有一个用零填充的 Numpy 二维数组(7 行,7 列):
my_array = numpy.zeros((7, 7))
然后为了论证说我想 select 中间的元素并将其值设置为 1:
my_array[3,3] = 1
现在假设我的曼哈顿距离为 3,我如何将我的数组子集化为仅 select 小于或等于曼哈顿距离(从中间元素开始)的元素和将这些元素设置为 1?最终结果应该是:
我可以遍历二维数组中的每个元素,但不想这样做,因为这太昂贵了,尤其是当我的矩阵非常大且曼哈顿距离非常小时(例如 70x70 矩阵与曼哈顿距离 10).
我会用 meshgrid 创建一个大小为 2,n,n 的辅助矩阵来整理索引,然后减去所需的索引中心,对减去的索引的绝对值求和并进行阈值比较。这里有一些例子
import numpy as np
import matplotlib.pyplot as plt #to draw result
n=70 #size of matrix
distance = 10 #distance
centerCoord = [35,35]
#here i create a mesh matrix of indices
xarr = np.arange(n)
idxMat = np.meshgrid(xarr,xarr) #create a matrix [2,n,n]
pt = np.array(centerCoord).reshape(-1,1,1) #point of size [2,1,1]
elems = np.abs(idxMat-pt).sum(axis=0) <= distance
plt.matshow(elems)
结果:
如果您需要索引,那么调用 np.where
将 return 您 2 个数组 (xindexList,yindexList)