Python:将数组从一个范围等效到另一个范围

11 篇文章 0 订阅
9 篇文章 0 订阅
文章讨论了如何将一组数值从[-1,1]的范围转换到[-10000,10000],通过使用线性归一化方法,即对每个元素进行缩放和平移操作,确保数据在目标范围内保持原有的比例关系。
摘要由CSDN通过智能技术生成

目录

问题表述

代码解释


问题表述

x_iter的取值范围为

np.array([[-1, 1], [-1, 1], [-1, 1], [-1, 1]])

实际x的取值范围是

np.array([[-10000, 10000], [-10000, 10000], [-10000, 10000], [-10000, 10000]])

已知一组x_iter值如下,需要将其等效为实际x的值:

[[ 0.1  0.5  0.5  0.9]
 [-0.9  0.3 -0.7  0.5]
 [-0.1  0.7 -0.5  0.7]
 [-0.5  0.9 -0.9 -0.7]
 [-0.3 -0.5  0.1 -0.9]
 [ 0.3 -0.7  0.3  0.3]
 [ 0.5 -0.1  0.7  0.1]
 [ 0.9  0.1 -0.3 -0.5]
 [-0.7 -0.3  0.9 -0.3]
 [ 0.7 -0.9 -0.1 -0.1]]

用以下代码:

# 取值范围
bounds = np.array([[-1, 1], [-1, 1], [-1, 1], [-1, 1]])
real_bounds = np.array([[-10000, 10000], [-10000, 10000], [-10000, 10000], [-10000, 10000]])
# 给定一组值
x_iter = np.array([[ 0.1,  0.5,  0.5,  0.9],
 [-0.9,  0.3, -0.7,  0.5],
 [-0.1,  0.7, -0.5,  0.7],
 [-0.5,  0.9, -0.9, -0.7],
 [-0.3, -0.5,  0.1, -0.9],
 [ 0.3, -0.7,  0.3,  0.3],
 [ 0.5, -0.1,  0.7,  0.1],
 [ 0.9,  0.1, -0.3, -0.5],
 [-0.7, -0.3,  0.9, -0.3],
 [ 0.7, -0.9, -0.1, -0.1]])
# 映射到真实范围中
rescaled_x = np.zeros(x_iter.shape)
for i in range(bounds.shape[0]):
    rescaled_x[:, i] = (x_iter[:, i] - bounds[i, 0]) / (bounds[i, 1] - bounds[i, 0]) * (real_bounds[i, 1] - real_bounds[i, 0]) + real_bounds[i, 0]
print(rescaled_x)

结果:

[[ 1000.  5000.  5000.  9000.]
 [-9000.  3000. -7000.  5000.]
 [-1000.  7000. -5000.  7000.]
 [-5000.  9000. -9000. -7000.]
 [-3000. -5000.  1000. -9000.]
 [ 3000. -7000.  3000.  3000.]
 [ 5000. -1000.  7000.  1000.]
 [ 9000.  1000. -3000. -5000.]
 [-7000. -3000.  9000. -3000.]
 [ 7000. -9000. -1000. -1000.]]

代码解释

用以下这种代码便于理解:

original_data = np.array([[ 0.1,  0.5,  0.5,  0.9],
 [-0.9,  0.3, -0.7,  0.5],
 [-0.1,  0.7, -0.5,  0.7],
 [-0.5,  0.9, -0.9, -0.7],
 [-0.3, -0.5,  0.1, -0.9],
 [ 0.3, -0.7,  0.3,  0.3],
 [ 0.5, -0.1,  0.7,  0.1],
 [ 0.9,  0.1, -0.3, -0.5],
 [-0.7, -0.3,  0.9, -0.3],
 [ 0.7, -0.9, -0.1, -0.1]])

min_old, max_old = -1, 1
min_new, max_new = -10000, 10000

rescaled_data = (original_data - min_old) / (max_old - min_old) * (max_new - min_new) + min_new

这段代码的目的是将矩阵original_data的所有元素从[-1,1]的范围等效转换到[-10000,10000]的范围。

这个公式 (original_data - min_old) / (max_old - min_old) * (max_new - min_new) + min_new 是一种被称为归一化的方法,它把数据从一个范围转换到另一个范围。

这是一种线性转换,它首先把元素从原始范围转换到[0,1](这一步通过(original_data - min_old) / (max_old - min_old)实现),然后再把元素从[0,1]转换到目标范围[ min_new, max_new]((max_new - min_new) + min_new进行这个转换)。

这个公式进行的变换是带有缩放和平移的线性变换,对每个元素都做同样的处理。这样做可以保证数据的最大值和最小值分别映射到目标范围的最大值和最小值。

最后,rescaled_data这个新矩阵就是将original_data的元素经过这种线性转换处理后的结果。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值