Python: нелинейное смешивание двух массивов - PullRequest
0 голосов
/ 13 марта 2019

У меня есть простой линейный блендер, который берет два массива и смешивает их вместе с учетом верхней и нижней границ. Я хочу сделать это обрабатывать нелинейные функции, такие как эта сигма-функция.

Оригинал представляет собой линейное смешение, где a и b смешиваются вдоль прямой (a * ds2) + (b * ds1).

Я заинтересован в попытках использовать некоторые методы нелинейного смешивания, но не уверен, как реализовать такое же истинное смешивание с помощью сигма / логистической функции или какого-то полинома? - Здесь мы фактически не смешиваем через l: h способ, которым работает линейное смешивание.

Приветствия

import matplotlib.pyplot as plt
import math
import numpy as np

def sigmaf(x):
    m=np.mean(x)
    a = []
    for i in x:
        a.append(1. / (1. + math.exp(-(i-m)/0.01)))
    return a

def new_blender(ds1,ds2,h=0.2,l=0.15): 
    #This makes a linear blend:
    a=(ds1-l)/(h-l)
    b=(h-ds1)/(h-l)
    out = (a*ds2)+b*ds1

    #But we want something more like this:
    ##http://matlab.cheme.cmu.edu/2011/10/30/smooth-transitions-between-discontinuous-functions/
    sig=sigmaf(ds1)
    out=((1-np.array(sig))*(np.array(ds1)))+(sig*(np.array(ds2)))
    #Close, but this still not blending exactly how we want

    out = np.where(ds1 < l, ds1, out)
    out = np.where(ds1 > h, ds2, out)
    return out

def test_blender():
    test_a=np.arange(0.1,0.3,0.001)
    test_b=np.arange(0.3,0.5,0.001)
    blend=new_blender(test_a,test_b)
    #print(test_a)
    #print(test_b)
    #print(blend)
    plt.plot(test_a)
    plt.plot(test_b)
    plt.plot(blend,linestyle=':',linewidth=3)
    plt.show()
test_blender()
...