Numpy:如何将矢量化函数应用于带dtype的数组

时间:2016-09-12 15:23:50

标签: python numpy

我正在关注如何使用numpy来操作图像的this。当我使用scipy加载样本图像时,我得到了一个RGB元组的二维数组,最后附加了一个dtype值。

array([[7, 8, 5],
   [3, 5, 7]], dtype=uint8)

我写了一个函数并将其矢量化了

def myfunc(a, b):
    return a + 2

vfunc = np.vectorize(myfunc)

但是当我将它应用于我的数组时,结果没有dtype

array([[9, 10, 7],
   [5, 7, 9]])

我的猜测是因为没有定义“dtype + 2”,它只是丢失了数组的那个元素。

如何编写一个在向量化并将其应用于numpy数组时不会去除dtype的函数?

2 个答案:

答案 0 :(得分:1)

np.vectorize需要otypes个参数。您可以使用它来指定返回的dtype。如果没有vectorize对数组的第一个元素进行试算,并使用返回dtype来确定整个回复的dtype。

查看其文档中的第3个示例。

当第一个值产生一个整数值(例如0)时,用户通常会遇到这种情况,并且他们希望整个事物都是浮动的。

所以试试:

 vfunc = np.vectorize(myfunc, otypes=[np.uint8])

答案 1 :(得分:0)

dtype=uint8不是数组的元素。这只是一个打印的东西,让你知道数组是np.uint8类型。

默认类型np.float_np.int_没有这样的打印输出,这是您在第二种情况下看到的。你可以告诉float和int数组的方法是float数组在数字中总是有小数点。

发生这种情况的原因是您要向阵列的每个元素添加2。由于2是一个整数,因此输出数组会被提升为np.int_类型,并且您无法获得明确的dtype打印输出。

您可以尝试以下实验:重新定义myfunc以向数组元素添加np.uint8而不是整数,并尝试打印结果:

def myfunc(a, b):
    return a + np.uint8(2)

最后,请记住,向量化Python代码通常不是完成任务的最佳方式。函数本身将是一个Python函数,因此很慢。通常最好找到一种用numpy函数执行任何操作的方法。