是否可以在不强制转换的情况下初始化 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?