我偶然到一个小问题试图创建随机抽取样本的矩阵当中使用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
功能类似的方式都做到了,但也许有更好的方法来做到这一点?
您尝试使用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)阵列上是概念性,和计算,更简单。