Q1(601): f= open(finished_flag,"w+")
Q2(Ln505):
if isflip: Mask = Mask[:,::-1,::-1]Q3(507):
newshape = np.round(np.array(Mask.shape)*spacing/resolution).astype('int') m1 = Mask==3 m2 = Mask==4 Mask = m1+m2Q4:
xx,yy,zz= np.where(Mask)Q5:
def process_mask(mask): convex_mask = np.copy(mask) for i_layer in range(convex_mask.shape[0]): mask1 = np.ascontiguousarray(mask[i_layer]) if np.sum(mask1)>0: mask2 = convex_hull_image(mask1) if np.sum(mask2)>1.5*np.sum(mask1): mask2 = mask1 else: mask2 = mask1Q6:
sliceim[bones] = pad_valuePool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,才会创建新的进程来执行这些请求。
multiprocessing模块提供process类实现新建进程。 如果要同时创建多个子进程可以使用multiprocessing.Pool类。该类可以创建一个进程池,然后在多个核上执行这些进程。
map() 函数原型: map(func, iterable[, chunksize=None]) Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到返回结果。 注意,虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。
close() 关闭进程池(pool),使其不在接受新的任务。
join() 主进程阻塞等待子进程的退出,join方法必须在close或terminate之后使用。
并发执行的时间明显比顺序执行要快很多,但是进程是要耗资源的,所以平时工作中,进程数也不能开太大。
xrange() 函数用法与 range 完全相同,所不同的是生成的不是一个数组,而是一个生成器。
partial函数的作用就是:将所作用的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数的后续参数,原函数有关键字参数的一定要带上关键字,没有的话,按原有参数顺序进行补充。
numpy.where()函数是三元表达式x if condition else y的矢量化版本。
返回一个数组,或者由数组组成的元组。
根据定义条件返回元素,这些元素或者从x中获得,或者从y中获得。 如果只给出条件,没有给出[,x, y],返回条件中非零(True)元素的坐标。
numpy.ascontiguousarray(a, dtype=None)
在内存中返回一个连续的数组
Parameters:
a : array_like Input array. dtype : str or dtype object, optional Data-type of returned array.
Returns:
out : ndarray Contiguous array of same shape and content as a, with type dtype if specified.
Examples:
>>>x = np.arange(6).reshape(2,3) >>>np.ascontiguousarray(x, dtype=np.float32) array([[ 0., 1., 2.], [ 3., 4., 5.]], dtype=float32) >>>x.flags['C_CONTIGUOUS'] True mask1 = np.ascontiguousarray(mask[i_layer]) #如果不是C连续的内存,必须强制转换python数字图像处理(18):高级形态学处理
