是否可以在不强制转换的情况下初始化 float32 或 float16 的随机数组?

Posted

技术标签:

【中文标题】是否可以在不强制转换的情况下初始化 float32 或 float16 的随机数组?【英文标题】:Is it possible to initialize a random arrays of float32 or float16 without casting? 【发布时间】:2020-08-15 05:24:35 【问题描述】:

我看到有 np.random.uniform,但来自文档 https://numpy.org/doc/stable/reference/random/generated/numpy.random.uniform.html

数据类型没有参数,默认使用 float.64 值。

我不能只将值转换为 float32 或 float16,因为我需要在 float64 处初始化数组,并且对于我正在使用的嵌入数量,这会耗尽我环境中的所有 ram。

【问题讨论】:

【参考方案1】:

您可以使用random generator api 为float32 实现此目的,它确实具有random 方法的dtype 参数。遗憾的是,这不会接受 float16。

import numpy as np
size = [1, 100]
high = 50
low = 20
rand_array = np.random.default_rng().random(size, dtype=np.float32) * (high - low) + low

此代码将使 rand_array 成为形状为 [1,100] 的 float32 数组,其中随机数介于 20 和 50 之间。

【讨论】:

【参考方案2】:

一种选择是接受转换的需要,但要分块进行,不会导致您超出可用内存。调整chunk_size 以将显式循环所花费的时间控制在相当小的数量,同时避免过多的内存使用。

import numpy as np

def uniform(minval, maxval, length,
              dtype=None, chunk_size=100000):
    
    answer = np.empty((length), dtype=dtype)
    for start in range(0, length, chunk_size):
        end = min(start + chunk_size, length)
        answer[start:end] = np.random.uniform(minval, maxval, end - start)

    return answer


x = uniform(2, 4, 1234567, dtype=np.float16)
print(x, x.dtype)

【讨论】:

以上是关于是否可以在不强制转换的情况下初始化 float32 或 float16 的随机数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以键入别名函数并在不强制转换的情况下使用它们?

如何在不强制转换为数字的情况下迭代日期列表?

Jackson 如何在不强制转换的情况下将 JsonNode 转换为 ArrayNode?

有没有办法强制 Win32 计时器在不空闲时执行?

Go:为啥从 float64 转换为 float32 并返回会导致值发生变化? [复制]

为啥 Pandas 将我的 numpy float32 强制转换为 float64?