Python:创建一个由正弦函数加权的数组

3

我可以通过以下方式创建一个从0到30的包含100个等间距数字的数组 -

theta = linspace(0,30,100)

可以从0到30获取一个包含100个数字的数组,这些数字不是均匀间隔的,而是根据它们的正弦函数加权。下面的图片可以让你大致了解我想要的内容。我定义的theta选择均匀地选择点(就像第一张图片)。我希望该数组按其正弦函数进行加权。随着数字从0到30的增加,它们的sin(value)值也会增加,因此在我的数组中,我希望更频繁地选择较高的数字(就像第二张图片)。

你能确认一下,当你说0到30之间时,是指角度还是弧度? - Simon Gibbons
我不确定是角度还是弧度。原帖似乎想要在通用数轴上的数字看起来有点像正弦波,几乎像一个函数np.sinespace而不是linspacelogspace - Ffisegydd
Simon,我的意思是角度。是的,我希望有一个像np.sinespace()这样的函数 :) 这将非常完美。 - Panchi
2个回答

3

我认为我有解决方案。它需要一个最初是线性间隔的数组,然后对其进行正弦运算,接着返回经过缩放的正弦值,使其末尾与线性数组相同。

import numpy as np
import matplotlib.pyplot as plt

def sinespace(m=90, n=10):
    x = np.linspace(0, m, n)
    s = np.sin(np.deg2rad(x))
    return (s/s[-1])*m

s = sinespace()
print(s)

plt.plot(s, np.ones_like(s), 'ro')
plt.show()

请注意,对于最大值为30的情况,间距与线性间距非常相似。这是因为当θ很小时,θ与sin(θ)呈线性关系(当θ以弧度表示时,θ~=sin(θ))。为了展示"正弦间距",我将其绘制到90度以使其更加明显。 enter image description here

这个可行!!!Yaayyy :) 非常感谢你的帮助!!!你应该加入Python开发团队!!!非常感谢! - Panchi

1

我不确定您是否需要更具体的内容,但是您可以通过从 linspace 开始创建任意数组。对于您的“sin”情况,请尝试以下代码:

theta = np.sin(np.linspace(0,np.pi/6,100)) * 30 / np.sin(np.pi/6)

@agenders3,这再次给我一个均匀分布的数组,只是乘以其正弦函数。我不希望该数组在线性比例尺上均匀分布。因此,我不希望它被正弦函数乘以,而是被其加权!(我希望我的意思表达清楚!) - Panchi
@Panchi 抱歉 :/ 我有点难以理解你的意思。也许你可以为你的问题提供更多的上下文?数组的索引始终是均匀分布的(这就是数组的本质),但你可以像我这样改变值的间距。 - aganders3
如果一个数组的索引总是均匀分布的,那么我希望它成为正弦空间(就像你可以使用logspace代替linspace一样)。因为Python没有这样的功能,所以我也可以使用列表。但是,该列表(或数组)中的值应该由正弦函数加权Sin 0 = 0,所以我的列表中不应该有0。它应该从0到30选择100个值,但不是均匀分布...它应该从0-10选择约10个值,然后从10到20选择约30个值,最后从20到30选择约60个值。 - Panchi
我不知道该告诉你什么 - 我的代码和被接受的答案做了同样的事情。无论如何,很高兴你把它搞定了! - aganders3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接