【问题标题】:Numpy: how to apply vectorized functions to array with dtypeNumpy:如何将矢量化函数应用于具有 dtype 的数组
【发布时间】:2017-01-20 02:17:20
【问题描述】:

我正在关注this tutorial,了解如何使用 numpy 来处理图像。当我使用 scipy 加载示例图像时,我得到一个 RGB 元组的二维数组,最后附加了一个 dtype 值。

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

我写了一个函数并向量化了它

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

vfunc = np.vectorize(myfunc)

但是当我将它应用到我的数组时,结果没有数据类型

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

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

如何编写一个函数,当我对它进行矢量化并将其应用于 numpy 数组时不会剥离 dtype?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

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

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

    那就试试吧:

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

    【讨论】:

    • 很高兴你提到otypes
    【解决方案2】:

    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 函数执行您想要的任何操作。

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 2021-06-30
      • 2020-04-06
      • 2018-05-02
      • 2015-02-21
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多