python-3.x - 在没有中间浮点数组的情况下将整数 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'
您知道在最小化内存占用的同时执行此操作的方法吗?
我在哪里可以更改错误消息中提到的强制转换规则?
解决方案
在阅读了一些 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")
我应该早点找到这个,但如果你不熟悉一些技术词汇,这并不容易阅读。
推荐阅读
- c# - Selenium 与 Sikuli4Net 无法将图像与从 chrome 驱动程序启动的全屏进行比较
- javascript - Google Apps 脚本 - 电子邮件作为字符串
- salesforce - 使用 External_ID__c 不会在 Salesforce 的联系人中加载任何记录
- android - 是否可以在 Room Dao 中向上转换?
- mysql - 将 laravel 部署到 InfinityFree
- python - Heroku 无法识别 Python 版本(这是必需的版本,在本例中为 3.6.4)
- jmeter - 如何使用rest api在jmeter中自动化100个用户
- jdbc - 是否可以使用 SNMP 获取 JDBC 池属性值?
- c# - 将输入日期文本框和模型项值传递给控制器 MVC 5
- css - CSS:用绝对位置变换比例