在numpy数组中添加浮动坐标。

问题描述 投票:3回答:1

我想把浮动坐标添加到numpy数组中,根据坐标的质量中心分割强度到相邻的像素。

以整数为例。

import numpy as np

arr = np.zeros((5, 5), dtype=float)

coord = [2, 2]
arr[coord[0], coord[1]] = 1

arr
>>> array([[0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 1., 0., 0.],
           [0., 0., 0., 0., 0.],
           [0., 0., 0., 0., 0.]])

但是我想在以下情况下将强度分配给相邻的像素: coord 是浮动数据,例如 coord = [2.2, 1.7].

我已经考虑使用高斯,例如。

grid = np.meshgrid(*[np.arange(i) for i in arr.shape], indexing='ij')

out = np.exp(-np.dstack([(grid[i]-c)**2 for i, c in enumerate(coord)]).sum(axis=-1) / 0.5**2)

可以得到很好的结果,但对于三维数据和数千个点来说就变得很慢了。

任何建议或想法都将被感激,谢谢。

根据@rpoleski的建议,采取局部区域并按距离进行加权。这是一个很好的想法,虽然我的实现没有保持坐标的原始质量中心,例如。

from scipy.ndimage import center_of_mass

coord = [2.2, 1.7]

# get region coords
grid = np.meshgrid(*[range(2) for i in coord], indexing='ij')
# difference Euclidean distance between coords and coord
delta = np.linalg.norm(np.dstack([g-(c%1) for g, c, in zip(grid, coord)]), axis=-1)

value = 3 # pixel value of original coord
# create final array by 1/delta, ie. closer is weighted more
# normalise by sum of 1/delta
out = value * (1/delta) / (1/delta).sum()

out.sum()
>>> 3.0 # as expected

# but
center_of_mass(out)
>>> (0.34, 0.63) # should be (0.2, 0.7) in this case, ie. from coord

有什么想法吗?

python arrays numpy multidimensional-array
1个回答
2
投票

这里有一个简单的(因此很可能足够快)解决方案,它保留了质量中心,并且sum = 1。

arr = np.zeros((5, 5), dtype=float)

coord = [2.2, 0.7]

indexes = np.array([[x, y] for x in [int(coord[0]), int(coord[0])+1] for y in [int(coord[1]), int(coord[1])+1]])
values = [1. / (abs(coord[0]-index[0]) * abs(coord[1]-index[1])) for index in indexes]
sum_values = sum(values)
for (value, index) in zip(values, indexes):
    arr[index[0], index[1]] = value / sum_values
print(arr)
print(center_of_mass(arr))

其结果是:

[[0.   0.   0.   0.   0.  ]
 [0.   0.   0.   0.   0.  ]
 [0.   0.24 0.56 0.   0.  ]
 [0.   0.06 0.14 0.   0.  ]
 [0.   0.   0.   0.   0.  ]]
(2.2, 1.7)

注意:我使用的是出租车的距离--它们很适合质量中心的计算。

© www.soinside.com 2019 - 2024. All rights reserved.