繁体   English   中英

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

[英]Is it possible to initialize a random arrays of float32 or float16 without casting?

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

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

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

您可以使用随机生成器 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 之间。

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

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM