【发布时间】:2017-07-28 07:46:05
【问题描述】:
我有一个 2D 数据数组,我正在尝试以有效的方式获取关于其中心的值的配置文件。所以输出应该是两个一维数组:一个是到中心的距离值,另一个是原始 2D 中距离中心该距离的所有值的平均值。
每个索引与中心的距离都不是整数,这使我无法使用一些已知的解决方案来解决该问题。请允许我解释一下。
考虑这些矩阵
data = np.random.randn(5,5)
L = 2
x = np.arange(-L,L+1,1)*2.5
y = np.arange(-L,L+1,1)*2.5
xx, yy = np.meshgrid(x, y)
r = np.sqrt(xx**2. + yy**2.)
所以矩阵是
In [30]: r
Out[30]:
array([[ 7.07106781, 5.59016994, 5. , 5.59016994, 7.07106781],
[ 5.59016994, 3.53553391, 2.5 , 3.53553391, 5.59016994],
[ 5. , 2.5 , 0. , 2.5 , 5. ],
[ 5.59016994, 3.53553391, 2.5 , 3.53553391, 5.59016994],
[ 7.07106781, 5.59016994, 5. , 5.59016994, 7.07106781]])
In [31]: data
Out[31]:
array([[ 1.27603322, 1.33635284, 1.93093228, 0.76229675, -0.00956535],
[ 0.69556071, -1.70829753, 1.19615919, -1.32868665, 0.29679494],
[ 0.13097791, -1.33302719, 1.48226442, -0.76672223, -1.01836614],
[ 0.51334771, -0.83863115, -0.41541794, 0.34743342, 0.1199237 ],
[-1.02042539, 0.90739383, -2.4858624 , -0.07417987, 0.90748933]])
在这种情况下,距离索引的预期输出应该是 array([ 0. , 2.5 , 3.53553391, 5. , 5.59016994, 7.07106781]),第二个长度相同的数组应该是那些对应距离处所有值的平均值:array([ 0.98791323, -0.32496927, 0.37221219, -0.6209728 , 0.27986926, 0.04060628])。
来自this answer 有一个非常好的函数可以计算任意点的轮廓。然而,他的方法的问题在于它通过索引距离来近似距离r。所以他的r 对我来说是这样的:
array([[2, 2, 2, 2, 2],
[2, 1, 1, 1, 2],
[2, 1, 0, 1, 2],
[2, 1, 1, 1, 2],
[2, 2, 2, 2, 2]])
这对我来说是一个很大的不同,因为我正在使用小矩阵。然而,这个近似值允许他使用np.bincount,这非常方便(但对我不起作用)。
我一直在尝试将其扩展为浮动距离,例如我的版本r,但到目前为止还没有运气。 bincount 不适用于浮点数,histogram 需要等间距的 bin,但事实并非如此。有什么建议吗?
【问题讨论】:
-
使用
((xx**2. + yy**2.)/6.25).astype(int)作为bincount的bin 怎么样? -
或者在
r上使用np.digitize。 -
@PaulPanzer 我不明白如何使用数字化来做到这一点。愿意举个例子吗?
-
这类似于@Divakar 的库函数所做的。您将提供距离的升序序列来定义要组合在一起的环。将这些 bin 应用于
r,您将得到一个与 Divakar 的 Out[280] 非常相似的矩阵。 -- 不相关:我想知道您是否要将相同的距离配置文件应用于许多图像? -
@PaulPanzer 给定集合的距离配置文件是固定的,所以我只需将其与图像列表一起传递给函数
标签: python performance numpy matrix