我正在关注如何使用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的函数?
答案 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函数执行任何操作的方法。