python - 取决于前一个轴的索引的数组切片最大值

标签 python arrays numpy slice

所以我有一个来自 tiff 图像的大型二维阵列,我想在其中计算质心。为此,我使用图像的索引(作为坐标)和平均函数:

from PIL import Image
from numpy import *

Im    = Image.open("32bit_grayscale.tif")
imArr = array(Im, dtype='float32')
indx  = indices(imArr.shape)

cenMassX = average(indx[0,:,:],weights=imArr[:,:])
cenMassY = average(indx[1,:,:],weights=imArr[:,:])

在其他一些类似的图像中,我想要计算两个独立的质心。两个计算区域都被一条直线分开,我有它的方程式。

我想再次使用average 方法,因为它非常有效,但我需要设置indx 第二轴切片的最大值> 数组到当前第一个轴值的函数。如果该行类似于 y=slope*x+interY,我将需要这样的内容:

cenMassX_A = average(indx[0,:,:slope*row+interY],weights=imArr[:,:slope*row+interY])
cenMassY_A = average(indx[1,:,:slope*row+interY],weights=imArr[:,:slope*row+interY])
cenMassX_B = average(indx[0,:,slope*row+interY:],weights=imArr[:,slope*row+interY:])
cenMassY_B = average(indx[1,:,slope*row+interY:],weights=imArr[:,slope*row+interY:])

其中 row 表示第一个轴索引(“x”轴)的当前值。忽略我可以根据方程式超出数组限制的事实。

我可以使用 for 循环来做到这一点,但它非常低效(20 倍)并且不是很“pythonic”:

cenMassX_A = 0
cenMassY_A = 0
cumSum     = 0
for row in range(0,imArr.shape[0]):
    for col in range(0,int(round(slope*row+interY))):
        cenMassX_A += row*imArr[row,col]
        cenMassY_A += col*imArr[row,col]
        cumSum     += imArr[row,col]
cenMassX_A /= cumSum
cenMassY_A /= cumSum

cenMassX_B = 0
cenMassY_B = 0
cumSum     = 0
for row in range(0,imArr.shape[0]):
    for col in range(int(round(slope*row+interY)),imArr.shape[1]):
        cenMassX_B += row*imArr[row,col]
        cenMassY_B += col*imArr[row,col]
        cumSum     += imArr[row,col]
cenMassX_B /= cumSum
cenMassY_B /= cumSum

那么,有没有办法做到这一点,还是我坚持使用 for 循环?我一直在阅读有关面具和滚动窗口的信息,但仍然无法找到解决方案。 提前致谢!

最佳答案

如果为直线一侧或另一侧的所有点设置 imArr[i,j]=0 会发生什么情况?这是最简单的屏蔽方法。

I = indx[0,...]*slope + indx[1,...]>=M
imArr1 = imArr.copy()
imArr1[I]=0
print np.average(indx[0,...],weights=imArr1)
print np.average(indx[1,...],weights=imArr1)

imArr1 = imArr.copy()
imArr1[~I]=0

print np.average(indx[0,...],weights=imArr1)
print np.average(indx[1,...],weights=imArr1)

如果我拍摄一个简单的“图像”并将其连接到自身(水平或对角线),则效果很好。

关于python - 取决于前一个轴的索引的数组切片最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22231347/

相关文章:

javascript - 如何将 HTML 与 Python 结合起来?

python - 我可以从Google Analytics(分析)API获取网站上所有网址的列表吗?

java - 添加和乘以二维矩阵

c# - 大型多维数组(锯齿状数组)C# 的解决方法?

python - Numpy 检查两个数组的元素大致相等的位置

python - 在 Pygame 中检测多边形和矩形之间的碰撞

python - 构建和比较时间

javascript - 在 Express 中将数组传递给 Jade/Pug 路由

python - Scikit 学习 : Randomized Logistic Regression gives ValueError: output array is read-only

python - Keras 单热编码器