2016-12-05 40 views
-1

我目前使用numpy来创建一个数组。我想使用矢量化实现来更高效地获取位置中元素的平均值(i,j)。这些阵列来自文件目录中的图像,这些图像已经全部标准化为固定大小。为什么numpy数组中的最大元素值为255?

但是,当我尝试添加图像数组时,每个元素的总和以a(mod 256)形式返回。我怎样才能改变元素的最大值?

+0

我会说你的数组是'uint8'类型。使用'numpy.astype'来制作具有所需变量类型的另一个数组。例如'y = x.astype(numpy.uint16)'。 –

回答

1

你的阵列大概是numpy.uint8型的,所以他们回绕时,击中256

如果你想获得更大的效果,请使用astype第一个参数转换成一个较大的数据类型,例如:

a = np.array(..., dtype=np.uint8) 
b = np.array(..., dtype=np.uint8) 
c = a.astype(np.uint32) + b 

而且你也会得到更大数据类型的结果数组。

Per @Eric,避免暂时的,就可以使用the numpy add function(未法)做加法,传递一个dtype所以结果是新类型甚至在输入不转换,避免暂时的(至少在Python层面):

c = np.add(a, b, dtype=np.uint32) 
+0

或者更好的是,使用'c = np.add(a,b,dtype = np.uint32)'来避免做一个'a'的临时拷贝(这比'a'大4倍) – Eric

+0

@Eric:做这样的事情,但显然交互式解释器文档和[numpy在线文档](https://docs.scipy.org/doc/numpy/reference/generated/numpy.add.html#numpy.add)骗了我(他们只提到'out'参数,并没有真正避免溢出问题)。补充说,答案;我首先想要这样的东西。 – ShadowRanger

+2

我想你必须知道'ufuncs'知道这个参数可用:https://docs.scipy.org/doc/numpy/reference/ufuncs.html – Benjamin

0

你会好起来的第一个创建输出数组:

average = numpy.zeros(a.shape, numpy.float32) 
image = numpy.zeros_like(average) 

然后遍历图像和就地将起来:

for i in images: 
    image[:] = function_that_reads_images_as_uint8(i) 
    average += image 
average /= len(images) 

如果你不需要在除法步骤中的精度,你可能会得到int类型。

+0

或者你可以写'np.mean(图像, dtype = np.float32)',它避免了你不应该在numpy中使用的手动循环。 – Eric

+1

@Eric:除非您愿意将所有图像叠加在单个multidim ndarray中(这可能会限制大量图像的内存),这种方法非常优秀。我的方法只需要两个相同形状的数组,一个用于当前正在读取的图像,另一个用于结果。我也很惊讶地看到有关循环的说法。循环可以表示您没有充分利用矢量化的优势,但绝不是坏事,特别是在涉及使用内存的较大数据或数据集时。 – Benjamin

+0

你的方法需要3个数组,因为'.type(numpy.float32)'做了一个不必要的拷贝。但是你是对的,我没有考虑过这个评论中的内存限制,在这种情况下,循环是合理的 – Eric

相关问题