我有100张10 x 10的图像,我想将它们放在形状为100 x 10 x 10的单个数组中,然后一次性计算100张图像的质心(无循环)。 / p>
当前,我正在使用center_of_mass
中的函数scipy
,如下所示:
import numpy as np
from scipy.ndimage.measurements import center_of_mass
# Example data
image = np.arange(100).reshape(10,10)
images = np.repeat([image],100, axis=0)
result = []
for i in range(images.shape[0]):
result.append( center_of_mass(images[i,:]) )
是否可以删除for循环?
答案 0 :(得分:1)
您可以对labels
函数使用index
和center_of_mass
参数(每个图像一个标签)。缺点是内存使用率大约翻了一番。
labels = np.ones_like(images).cumsum(0)
result2 = [tup[1:] for tup in
center_of_mass(images, labels, index=np.arange(1, images.shape[0]+1))
]
assert result2 == result
答案 1 :(得分:1)
使用重塑矩阵和点积。 例如:
import numpy as np
# Example data
image = np.arange(80).reshape(8,10)
images = np.repeat([image],90, axis=0)
images_row=images.reshape((90, 8*10))
S=np.sum(images_row, axis=1)
Y_mat,X_mat = np.meshgrid(np.arange(10),np.arange(8))
Y_mats = np.repeat([Y_mat],90, axis=0)
Y_mats = Y_mats.reshape((90, 8*10))
X_mats= np.repeat([X_mat],90, axis=0)
X_mats = X_mats.reshape((90, 8*10))
#center of mass:
X_c=np.dot(images_row, X_mats.T)/S
Y_c=np.dot(images_row, Y_mats.T)/S