创建样本的矩阵:问题与np.apply_along_axis附加参数

问题描述 投票:0回答:1

我偶然到一个小问题试图创建随机抽取样本的矩阵当中使用numpy的人口。

我想创建一个矩阵,表示从我总体的样本,这样我就可以在每个样品上同时更有效地做业务的每一行。

我试着做以下几点:

import numpy as np

l = ["L"] * 36 + ["T1"]*20 + [0]*43

pop = np.array(l)

ech = np.random.choice(a = pop, size=7, replace=False)  # This is what I want my sample to be

A = np.full((30,1),7)  # Here I want 30 samples in my matrix

np.apply_along_axis(arr=A, func1d=np.random.choice, axis=1, a = pop)

不过,我得到以下错误:

TypeError: choice() got multiple values for keyword argument 'a'

作为np.random.choice功能需要几个参数,我创建的提交与第七集(因为我想从流行7种元素的样本),以使得尺寸参数来自A的每一行的值的矩阵,和一个参数在给定的通过a=pop结束。

我想知道是否有人知道错在这里是什么,以及如何解决它。

我用用np.apply_along_axis创建样品的这个矩阵,因为我将与R中的apply功能类似的方式都做到了,但也许有更好的方法来做到这一点?

python python-3.x numpy random
1个回答
1
投票

您尝试使用apply_along_axis的是混乱的,但我认为你正在尝试这样的:

一个样品从pop设置:

In [110]: pop = list('abcdefgijklm')
In [111]: np.random.choice(pop, size=7, replace=False)
Out[111]: array(['g', 'm', 'f', 'l', 'c', 'i', 'k'], dtype='<U1')

投为需要size作为自变量的函数:

In [112]: f = lambda s: np.random.choice(pop, size=s, replace=False)

直截了当的Python迭代中,不同尺寸的生成样本:

In [113]: [f(i) for i in [3,5,4]]
Out[113]: 
[array(['j', 'b', 'l'], dtype='<U1'),
 array(['l', 'e', 'k', 'm', 'b'], dtype='<U1'),
 array(['k', 'm', 'j', 'b'], dtype='<U1')]

但是,为了使样本的阵列中,size需要是相同的,所以我们可以这样做:

In [114]: np.array([f(7) for _ in range(3)])
Out[114]: 
array([['a', 'f', 'm', 'd', 'e', 'l', 'j'],
       ['i', 'g', 'f', 'b', 'j', 'e', 'l'],
       ['j', 'm', 'k', 'i', 'l', 'a', 'b']], dtype='<U1')

不过既然你坚持使用apply_along_axis,这里有一个方法:

In [122]: A = np.full((5,1), 7)
In [123]: np.apply_along_axis(f, 1, A)
Out[123]: 
array([['c', 'm', 'a', 'f', 'i', 'd', 'k'],
       ['j', 'm', 'k', 'd', 'b', 'l', 'g'],
       ['b', 'f', 'i', 'm', 'c', 'l', 'k'],
       ['k', 'f', 'd', 'l', 'b', 'c', 'g'],
       ['l', 'f', 'j', 'k', 'g', 'a', 'd']], dtype='<U1')

它会通过np.array([7])f 5次,并收集在一个阵列的结果。在这个时机版本apply比我[113]迭代慢一点。

要通过pop作为参数,我们不得不定义像func1d

In [135]: f = lambda s, a: np.random.choice(a, s, replace=False)
In [136]: np.apply_along_axis(f, 1, A, a=pop)
Out[136]: 
array([['j', 'd', 'b', 'f', 'c', 'l', 'k'],
       ['d', 'c', 'e', 'j', 'm', 'k', 'i'],
       ['l', 'g', 'j', 'k', 'e', 'f', 'a'],
       ['a', 'l', 'e', 'm', 'b', 'c', 'j'],
       ['j', 'e', 'g', 'f', 'l', 'd', 'a']], dtype='<U1')

apply_along_axis是3D(或更大)A可能是有用的,和你想一个函数应用于一个坐标轴,并反复对别人。它更容易比申请:

 for i in range...:
     for j in range ...:
         res[i,j,:] = func1d(A[i,j,:])

但在构造的2D阵列(N,1),只是可以迭代在第一轴线,使所述第二(尺寸1)轴的功能。迭代A(N)阵列上是概念性,和计算,更简单。

© www.soinside.com 2019 - 2024. All rights reserved.