【问题标题】:how can I linear stretch an array to a bigger size one using numpy?如何使用 numpy 将数组线性拉伸到更大的尺寸?
【发布时间】:2019-11-05 15:35:09
【问题描述】:

我想在更大的数组上线性拉伸增加的 numpy 数组

[2, 4, 6, 8, 10] 类似于:[1.25, 2.5, 3.75, 5, 6.25, 7.5, 8.75, 10]

但一个解决方案可能会接收到普遍增加的输入并仍然线性拉伸它 比如说:

[ 2, 4, 6, 7, 8, 10, 20, 20, 20] 并在大小为 20 的数组上线性拉伸

是否有任何现有的 numpy 函数或其他简单的方法?

已编辑:

我会尽量让我的问题更容易理解

我正在尝试均衡图像。 作为该过程的一部分,我使用直方图和累积直方图

检查累积直方图时 - 我的第一个灰度级可能不是 0,我的最后一个灰度级可能不是 MAX_VAL(在我的情况下为 255) 我想获取接收到的值(一些单调递增的数组),并拉伸它们,使我的第一个灰度级为 0,最后一个为 MAX_VAL。

我正在考虑通过 [第一个灰度级:最后一个灰度级] 裁剪数组,然后尝试将其拉伸回原始大小(在我的情况下为 256),但我似乎不明白该怎么做

提前致谢

【问题讨论】:

  • 对不起,我不明白。可能您想要的与numpy.linspace 松散耦合,但是,相信我,您的问题并不清楚......如果您认为可以改进您的问题,请按照上一个链接edit 它。

标签: python arrays numpy stretch


【解决方案1】:

这个问题似乎在两种意义上使用了“伸展”。
1) 将数组中的值转换为给定范围。
2) 将数组扩展为更大的数组。

版本 1.a -> 0 到 255,大小没有变化。

def translate(x, mx):
    lo = x.min()
    rng = x.max()-lo
    return (x-lo)*mx/rng

a =np.array([10, 15,16,20, 25, 125, 126, 130, 150, 200, 201., 202])

at = translate(a,255.)
print(at)
# array([  0.      ,   6.640625,   7.96875 ,  13.28125 ,  19.921875,
#        152.734375, 154.0625  , 159.375   , 185.9375  , 252.34375 ,
#        253.671875, 255.      ])

数组 a 保持相同大小,但值被拉伸以填充 0 到 255 的范围。

第 2 版

x = np.arange(len(a)) # An independent x for each a (or at)
new_x = np.linspace( 0., 11., 24)  # Make the result have 25 elements, from 11.
print(new_x)
# [ 0.          0.47826087  0.95652174  1.43478261  1.91304348  2.39130435
#   2.86956522  3.34782609  3.82608696  4.30434783  4.7826087   5.26086957
#   5.73913043  6.2173913   6.69565217  7.17391304  7.65217391  8.13043478
#   8.60869565  9.08695652  9.56521739 10.04347826 10.52173913 11.        ]

使用 new_x 根据 x 插入 a(或 at)值

np.interp(new_x, x, at) # The array at is made longer (25 elements) 
# array([  0.        ,   3.17595109,   6.35190217,   7.21807065,
#          7.85326087,  10.04755435,  12.58831522,  15.59103261,
#         18.7669837 ,  60.34307065, 123.86209239, 153.08084239,
#        153.71603261, 155.2173913 , 157.75815217, 163.99456522,
#        176.69836957, 194.59918478, 226.35869565, 252.45923913,
#        253.09442935, 253.72961957, 254.36480978, 255.        ])

np.interp(new_x, x, a) # The original array a is made longer (25 elements) 
# array([ 10.        ,  12.39130435,  14.7826087 ,  15.43478261,
#         15.91304348,  17.56521739,  19.47826087,  21.73913043,
#         24.13043478,  55.43478261, 103.26086957, 125.26086957,
#        125.73913043, 126.86956522, 128.7826087 , 133.47826087,
#        143.04347826, 156.52173913, 180.43478261, 200.08695652,
#        200.56521739, 201.04347826, 201.52173913, 202.        ])

我不确定任一答案是否符合问题,但这是我可以解释的两种方式。

【讨论】:

  • 感谢您的回复,我需要研究插值,以便确切了解它的作用
【解决方案2】:

像这样?

your_array = np.array([2,4,6,8,10])
streched_array = np.linspace(np.min(your_array),np.max(your_array),20)

【讨论】:

  • 我认为,如果原始数组中的值像 OP 所说的那样单调递增,那么使用第一个和最后一个元素作为下限和上限就足够了,而不是按顺序遍历整个数组两次找到最小值和最大值。不过还是不错的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 2018-05-18
  • 1970-01-01
  • 2015-12-12
相关资源
最近更新 更多