Python 有没有更优雅的方法来创建这些numpy阵列?

Python 有没有更优雅的方法来创建这些numpy阵列?,python,performance,numpy,Python,Performance,Numpy,我觉得我创建的阵列太多,浪费了资源,因此我正在寻找一种更干净、更高效的方法来解决以下问题: 假设我们有一个振荡图,我们知道最小值(minux)和最大值(max\ux)的位置。我们选取一个参考点ref_point(下图中约为2.35),最接近的极值(图中为2.25和2.45)分配1*PI,第二接近的极值分配值2*PI,依此类推。通过这种方式,我们得到了图上较低的图形(注意,这些值被-4*PI偏移,但这与现在无关) 以下是我的解决方案: 将numpy导入为np def最小值最大值(参考点、最小值x

我觉得我创建的阵列太多,浪费了资源,因此我正在寻找一种更干净、更高效的方法来解决以下问题:

假设我们有一个振荡图,我们知道最小值(
minux
)和最大值(
max\ux
)的位置。我们选取一个参考点
ref_point
(下图中约为2.35),最接近的极值(图中为2.25和2.45)分配1*PI,第二接近的极值分配值2*PI,依此类推。通过这种方式,我们得到了图上较低的图形(注意,这些值被-4*PI偏移,但这与现在无关)

以下是我的解决方案:

将numpy导入为np
def最小值最大值(参考点、最小值x、最大值x):
#查找小于参考点的最大值和最小值
neg_max_freq=np.数组([a表示in(ref_point-max_x),如果a<0])
neg_min_freq=np.数组([b表示b in(参考点-min_x),如果b<0])
#将它们连接在一起并翻转顺序
neg\u freq=排序(np.append(neg\u max\u freq,neg\u min\u freq),reverse=True)
#查找大于参考点的最大值和最小值
pos_max_freq=np.数组([c表示c in(参考点-max_x),如果c>0])
pos_min_freq=np.数组([d表示d in(参考点-min_x),如果d>0])
#把他们连在一起
pos\u freq=已排序(np.append(pos\u min\u freq,pos\u max\u freq))
pos_values=np.数组([np.pi*(i+1)表示范围内的i(len(pos_freq)))
neg_值=np.数组([np.pi*(i+1)表示范围内的i(len(neg_freq)))
#将图片上下部图形的值合并在一起
x_s=np.append(pos_freq,neg_freq)
y_s=np.append(pos_值、neg_值)
返回x_s,y_s
用法示例:

min_x=np.arange(np.pi/2,4.5*np.pi,np.pi) >>>max_x=np.arange(0,4*np.pi,np.pi) >>>x,y=最小值最大值(0,最小值x,最大值x) >>>x [ -1.57079633 -3.14159265 -4.71238898 -6.28318531 -7.85398163 -9.42477796 -10.99557429] >>>y [ 3.14159265 6.28318531 9.42477796 12.56637061 15.70796327 18.84955592 21.99114858]
有没有其他更有效的方法来实现相同的结果?

在这里,我将如何更改
min\u max
代码,而无需编写这么多临时变量和避免列表理解:

def min_max(ref_point, min_x, max_x):

    max_freq = ref_point - max_x
    min_freq = ref_point - min_x

    # Faster sort
    neg_freq = np.sort(np.append(max_freq[max_freq<0], min_freq[min_freq<0]))[::-1]
    pos_freq = np.sort(np.append(max_freq[max_freq>0], min_freq[min_freq>0]))

    pos_values = np.pi * np.arange(1, len(pos_freq)+1)
    neg_values = np.pi * np.arange(1, len(neg_freq)+1)

    x_s = np.append(pos_freq, neg_freq)
    y_s = np.append(pos_values, neg_values)

    return x_s, y_s

numpy比vanilla python快9.5倍。

注意
pos_values=np.pi*np.arange(len(pos_freq))
应该是
pos_values=np.pi*np.arange(1,len(pos_freq)+1)
也应该是
neg_值。谢谢你,这似乎是一个更好的解决方案。谢谢你抓住了这个机会。我将编辑解决方案
a = np.random.randint(0, 1000, 1_000_000)

%timeit sorted(a, reverse=True)
522 ms ± 29.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit np.sort(a)[::-1]
55.2 ms ± 958 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)