Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找图像中所有像素对之间的距离 问题:_Python_Performance_Numpy_Linear Algebra - Fatal编程技术网

Python 查找图像中所有像素对之间的距离 问题:

Python 查找图像中所有像素对之间的距离 问题:,python,performance,numpy,linear-algebra,Python,Performance,Numpy,Linear Algebra,我有一个numpy.array形状(H,W),存储图像的像素强度。我想生成一个新的形状数组(H,W,H,W),它存储图像中每对像素之间的欧氏距离(像素之间的“空间”距离;而不是它们强度的差异) 解决方案尝试 下面的方法正是我想要的,但速度很慢。我正在寻找一种快速的方法来做到这一点 d = numpy.zeros((H, W, H, W)) # array to store distances. for x1 in range(H): for y1 in range(W):

我有一个
numpy.array
形状
(H,W)
,存储图像的像素强度。我想生成一个新的形状数组
(H,W,H,W)
,它存储图像中每对像素之间的欧氏距离(像素之间的“空间”距离;而不是它们强度的差异)

解决方案尝试 下面的方法正是我想要的,但速度很慢。我正在寻找一种快速的方法来做到这一点

d = numpy.zeros((H, W, H, W)) # array to store distances.
for x1 in range(H):
    for y1 in range(W):
        for x2 in range(H):
            for y2 in range(W):
                d[x1, y1, x2, y2] = numpy.sqrt( (x2-x1)**2 + (y2-y1)**2 )
额外细节 以下是关于我的问题的更多细节。上面这个简单问题的一个解决方案可能足以让我解决剩下的问题

  • 在我的例子中,图像实际上是一个3D医学图像(即形状
    (H、W、D)
    )的
    numpy.array
  • 3D像素可能不是立方体(例如,每个像素可能代表1毫米x 2毫米x 3毫米的体积)

我们可以使用
np.ogrid
设置带有
1D
范围数组的开放网格,对于矢量化解决方案,可以使用相同的迭代器符号对其进行操作,这将提高性能。促进:

X1,Y1,X2,Y2 = np.ogrid[:H,:W,:H,:W]
d_out = numpy.sqrt( (X2-X1)**2 + (Y2-Y1)**2 )
要在两个打开的网格上保存,请执行以下操作:

X,Y = np.ogrid[:H,:W]
d_out = numpy.sqrt( (X[:,:,None,None]-X)**2 + (Y[:,:,None,None]-Y)**2 )

如果我们使用大数组,考虑使用<代码> NoNeXPR进行进一步的升力:

import numexpr as ne

d_out = ne.evaluate('sqrt( (X2-X1)**2 + (Y2-Y1)**2 )')

因此,您试图计算像素坐标之间的距离,而不是像素本身的强度?像素本身可能具有不同的体积?@Jensun这是一幅3D医学图像,其中每个3D像素(“体素”)代表一个小体积。体积是矩形棱柱体,但可能不是立方体。所有的体素都有相同的形状。必须计算体素质心之间的距离吗?@Jensun是的,质心之间的距离。我尝试了这些,它们似乎都有效,并且比我的循环方法更快。我有一个更大的问题,因为图像太大,无法实际执行此计算或存储结果-例如,一个100x100x100图像将有~10^6个像素和~10^12对像素。我把你的答案标记为接受,因为我认为它回答了我提出的问题。