微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 在3d numpy数组中查找区域的中心坐标

我有一个大的numpy 3d数组(10000,3,3).其中我想找到每个区域的中心坐标(具有相同数字的簇).每个子阵列可以具有1,2,3或4个区域.

我的数组的一个子集是:

largearray= array([[[1, 0, 0],
    [0, 0, 2],
    [3, 0, 2]],

   [[0, 0, 4],
    [0, 0, 4],
    [0, 0, 4]],

   [[5, 0, 0],
    [5, 0, 6],
    [0, 6, 6]],

   [[7, 0, 8],
    [0, 0, 0],
    [9, 0,10]]])

我想要的输出是子阵列的位置以及代表中心的x和y坐标:

#output:
array([[ 0., 0., 0.],
[ 0., 1.5, 2.],
[ 0., 2., 0.],
[ 1., 1.,  2.],
[ 2., 0.5,  0.],
[ 2., 1.66666667, 1.66666667],
[ 3., 0., 0.],
[ 3., 0., 2.],
[ 3., 2., 0.],
[ 3., 2., 2.]])

我对其他输出持开放态度,但这样的话会很棒!

提前致谢!

解决方法:

使用numpy_indexed软件包中的功能(免责声明:我是它的作者),可以构建一个完全矢量化的解决方案(即,没有for循环):

import numpy_indexed as npi
idx = np.indices(largearray.shape).reshape(largearray.ndim, largearray.size)
label, mean = npi.group_by(largearray, axis=None).mean(idx, axis=1)

对于大输入,这应该更有效.

请注意,如果标签在每个子阵列中不是唯一的(它们似乎在您的示例中,但未明确说明),但您仍然希望仅采用每个子阵列的平均值,您可以简单地写下:

(label, subarr), mean = npi.group_by((largearray.flatten(), idx[0])).mean(idx[1:], axis=1)

也就是说,通过子阵列索引和标签的唯一元组进行分组.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐