【问题标题】:numpy array for float values within range范围内浮点值的numpy数组
【发布时间】:2020-02-19 19:43:16
【问题描述】:

关于效率,我们如何创建一个大型 numpy 数组,其中值是特定范围内的浮点数。

例如,对于一个固定大小的一维 numpy 数组,其中值介于 0 和 200,000,000.00 之间(即 [0, 200,000,000.00] 中的值),我可以使用浮点数的最小数据类型创建数组 (@987654323 @),然后验证任何新值(来自用户输入),然后再将其插入数组:

import numpy as np

a = np.empty(shape=(1000,), dtype=np.float16))
pos = 0

new_value = input('Enter new value: ')

# validate
new_value = round(new_value, 2)
if new_value in np.arange(0.00, 200000000.00, 0.01):
    # fill in new value
    a[pos] = new_value
    pos = pos + 1

问题是,我们能否根据数组的dtype 强制执行new_value 的有效性(根据已知的最小/最大值和小数位数)?

换句话说,我们在创建数组时就知道小数的范围和个数,这是否让我们有机会(更)有效地在数组中插入有效值?

【问题讨论】:

  • new_value 应该被转换为a 的数据类型,即float16 你只需要确保它在你的范围内。但是,如果您想控制舍入的完成方式,那么使用某些功能来控制它可能会很有用。您不需要创建数组并检查您的值是否在一个简单的范围内检查是否应该这样做。 if 0 <= value < 2000000: #append...
  • 加上检查步长是否兼容(类似于new_value % step_size == 0),但要注意使用modulo on floatsor more general floating point math时的问题

标签: python python-3.x numpy validation numpy-ndarray


【解决方案1】:

我有点困惑你的代码是如何运行的,因为它不像这里展示的那样工作。

还有一点不清楚为什么要将新值附加到事先创建的空数组中。您是否打算用新的传入值而不是追加来填充创建的数组?

np.arange(0.00, 200000000.00, 0.01)

这条线导致了问题,因为它创建了一个巨大的数组,其值导致我的环境中的MemoryError 只是为了检查new_value 是否在某个范围内。

扩展我的评论并修复代码中的问题,我的解决方案看起来像

import numpy as np

max_value =  200000000
arr = np.empty(shape=(1000,), dtype=np.float16)

new_value = float(input('Enter new value: ')) # More checks might be useful if input is numeric

# validate
if 0 <= new_value <= max_value:
    new_value = round(new_value, 2) # round only if range criterion is fulfilled
    arr = np.append(arr, new_value) # in case you really want to append your value

【讨论】:

  • 您对追加是正确的-我编辑了问题以正确声明我只是在填充(插入)新值。也修正了一些错别字。道歉!让我知道现在是否有意义。
  • 请注意,您的回答非常有帮助 - 谢谢。关于第 6 行评论的问题:输入应该是数字,但可能不是;当你说more checks might be useful (...) 时,你的意思是检查它是一个字符串还是类似的?
  • 我认为input() 总是返回一个字符串,但它可能包含字符,因此将其转换为浮点数或其他内容会失败。这就是我检查输入的意思:-)
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多