将numpy.random.normal与数组一起使用

时间:2018-03-08 21:05:44

标签: python arrays python-3.x numpy

假设我有以下两个带有均值和标准差的数组:

a = np.random.normal(mu, sigma)

In [1]: a
Out[1]: array([1715.6903716 , 3028.54168667, 4731.34048645, 933.18903575])

然后:

a = np.random.normal(mu, sigma, 100)

a = np.random.normal(mu, sigma, 100)
Traceback (most recent call last):

File "<ipython-input-417-4aadd7d15875>", line 1, in <module>
a = np.random.normal(mu, sigma, 100)

File "mtrand.pyx", line 1652, in mtrand.RandomState.normal

File "mtrand.pyx", line 265, in mtrand.cont2_array

ValueError: shape mismatch: objects cannot be broadcast to a single shape

但是,如果我要求mu的每个元素100次抽奖,西格玛:

s = (100, 100, 100, 100)
a = np.random.normal(mu, sigma, s)

我也尝试使用大小的元组:

@SpringView(name = RegisterView.VIEW_NAME)
@DesignRoot
public class RegisterView extends VerticalLayout implements View {

    protected static final String VIEW_NAME = "register";

    @PostConstruct
    void init() {
        setSizeFull();
        setDefaultComponentAlignment(Alignment.MIDDLE_CENTER);
        createUIComponents();
        setSpacing(true);
    }

    private void createUIComponents() {
        addComponent(new Label("HEADER"));
        addComponent(createRegistrationForm());
        addComponent(new Label("TEST"));
    }

    private FormLayout createRegistrationForm() {
        final FormLayout layout = new FormLayout();
        final TextField firstNameTextField = new TextField("firstName");
        final TextField lastnameTextField = new TextField("lastname");
        layout.addComponents(firstNameTextField, lastnameTextField);
        return layout;
}

我缺少什么?

2 个答案:

答案 0 :(得分:1)

当你传递mean和std的值的列表/向量时,我不相信你可以控制size参数。相反,您可以迭代每对,然后连接:

np.concatenate(
   [np.random.normal(m, s, 100) for m, s in zip(mu, sigma)]
) 

这会为您提供(400, )数组。如果您想要(4, 100)数组,请拨打np.array而不是np.concatenate

答案 1 :(得分:1)

如果您只想进行一次通话,那么正态分布很容易在事后移位和重新缩放。 (我在这里以你的例子组成一个10000长的musigma向量):

mu = np.random.choice([2000., 3000., 5000., 1000.], 10000)               
sigma = np.random.choice([250., 152., 397., 180.], 10000)

a = np.random.normal(size=(10000, 100)) * sigma[:,None] + mu[:,None]

这很好用。您可以决定速度是否是一个问题。在我的系统上,以下速度只有50%:

a = np.array([np.random.normal(m, s, 100) for m,s in zip(mu, sigma)])