首页 > 解决方案 > 在没有中间浮点数组的情况下将整数 numpy 数组与浮点标量相乘

问题描述

我正在处理非常大的图像uint16数据数组,我想缩小并转换为uint8.

我最初的做法是MemoryError由于中间float64数组引起的:

img = numpy.ones((29632, 60810, 3), dtype=numpy.uint16) 

if img.dtype == numpy.uint16:
    multiplier = numpy.iinfo(numpy.uint8).max / numpy.iinfo(numpy.uint16).max
    img = (img * multiplier).astype(numpy.uint8, order="C")

然后我尝试按以下方式进行乘法运算:

if img.dtype == numpy.uint16:
    multiplier = numpy.iinfo(numpy.uint8).max / numpy.iinfo(numpy.uint16).max
    img *= multiplier
    img = img.astype(numpy.uint8, order="C")

但我遇到以下错误:

TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('uint16') with casting rule 'same_kind'

您知道在最小化内存占用的同时执行此操作的方法吗?

我在哪里可以更改错误消息中提到的强制转换规则?

标签: python-3.xnumpy

解决方案


在阅读了一些 numpy ufunc 文档后,我终于找到了一个可行的解决方案。

    multiplier = numpy.iinfo(numpy.uint8).max / numpy.iinfo(numpy.uint16).max
    numpy.multiply(img, multiplier, out=img, casting="unsafe")
    img = img.astype(numpy.uint8, order="C")

我应该早点找到这个,但如果你不熟悉一些技术词汇,这并不容易阅读。


推荐阅读