计算四舍五入比例的列表
Compute a list of rounded proportions
必填:
[10,20,-30] -> [1,2,-3]
[19,-14,15] -> [2,-1,2]
[-1.09,-0.92,0.02] -> [-109,-92,2]
[501.6545,-1857.1,897.543] -> [5,-19,9]
每个输入集中最接近零的数字在输出中应该是单个数字。比例必须保持大致恒定,接受舍入误差。
上下文:使用尽可能小的订单将模型中要购买的证券股数转换为 100 手的整数手数。
我可以用非 pythonic 的方式强制执行此操作,但我正在寻找有关要使用的 Python 函数的指针。我的背景是Java。
在 Python 中,您将使用 numpy
进行此类计算。我会建议这样的算法:
def process(array):
order_of_magnitude = np.floor(np.log10(np.min(np.abs(array))))
return np.round(array*10**(-order_of_magnitude))
解释:
- 找出数组中最小元素的数量级(不考虑符号)。
- 根据此缩放每个元素(或向上)。
- 四舍五入结果
您需要为此安装 numpy
。例如使用 pip
或通过您的 linux 发行版。
像这样将你的列表变成 numpy 数组:
array = np.array(your_list)
忽略你的例子,我实现了要求
The number closest to zero in each input set should be a single digit number in the output. The proportions must be kept approximately constant, rounding errors accepted.
该算法通过最接近零的值的绝对值对数据进行归一化,并将所得结果乘以 9 以保持最小的数字为一位,从而最大限度地减少后续的舍入误差。
def normalize(l):
import numpy as np
m = np.min(np.abs(l))
return np.round(l / m * 9).astype(int)
这是基于@user8408080 回答的正确答案。
import numpy as np
def process(array):
order_of_magnitude = np.floor(np.log10(np.min(np.abs(array)))).astype(int).item()
return np.round(np.asarray(array)*10**(-order_of_magnitude)).astype(int)
必填:
[10,20,-30] -> [1,2,-3]
[19,-14,15] -> [2,-1,2]
[-1.09,-0.92,0.02] -> [-109,-92,2]
[501.6545,-1857.1,897.543] -> [5,-19,9]
每个输入集中最接近零的数字在输出中应该是单个数字。比例必须保持大致恒定,接受舍入误差。
上下文:使用尽可能小的订单将模型中要购买的证券股数转换为 100 手的整数手数。
我可以用非 pythonic 的方式强制执行此操作,但我正在寻找有关要使用的 Python 函数的指针。我的背景是Java。
在 Python 中,您将使用 numpy
进行此类计算。我会建议这样的算法:
def process(array):
order_of_magnitude = np.floor(np.log10(np.min(np.abs(array))))
return np.round(array*10**(-order_of_magnitude))
解释:
- 找出数组中最小元素的数量级(不考虑符号)。
- 根据此缩放每个元素(或向上)。
- 四舍五入结果
您需要为此安装 numpy
。例如使用 pip
或通过您的 linux 发行版。
像这样将你的列表变成 numpy 数组:
array = np.array(your_list)
忽略你的例子,我实现了要求
The number closest to zero in each input set should be a single digit number in the output. The proportions must be kept approximately constant, rounding errors accepted.
该算法通过最接近零的值的绝对值对数据进行归一化,并将所得结果乘以 9 以保持最小的数字为一位,从而最大限度地减少后续的舍入误差。
def normalize(l):
import numpy as np
m = np.min(np.abs(l))
return np.round(l / m * 9).astype(int)
这是基于@user8408080 回答的正确答案。
import numpy as np
def process(array):
order_of_magnitude = np.floor(np.log10(np.min(np.abs(array)))).astype(int).item()
return np.round(np.asarray(array)*10**(-order_of_magnitude)).astype(int)