因此,我想知道是否存在一种更有效的解决方案,该方法使用np.random.choice
每行具有唯一值的位置生成二维数组。
例如,对于具有shape的数组(3,4)
,我们期望输出为:
# Expected output given a shape (3,4)
array([[0, 1, 3, 2],
[2, 3, 1, 0],
[1, 3, 2, 0]])
这意味着每行的值在列数方面必须是唯一的。因此,对于中的每一行out
,整数应仅介于0到3之间。
我知道,我可以通过传递实现它False
的replace
论据。但是我只能为每一行而不是整个矩阵执行此操作。例如,我可以这样做:
>>> np.random.choice(4, size=(1,4), replace=False)
array([[0,2,3,1]])
但是当我尝试这样做时:
>>> np.random.choice(4, size=(3,4), replace=False)
我收到这样的错误:
File "<stdin>", line 1, in <module>
File "mtrand.pyx", line 1150, in mtrand.RandomState.choice
(numpy\random\mtrand\mtrand.c:18113)
ValueError: Cannot take a larger sample than population when
'replace=False'
我认为这是因为3 x 4 = 12
由于矩阵的大小,它试图绘制样本而不进行替换,但我只给出了极限4
。
我知道我可以通过使用解决for-loop
:
>>> a = (np.random.choice(4,size=4,replace=False) for _ in range(3))
>>> np.vstack(a)
array([[3, 1, 2, 0],
[1, 2, 0, 3],
[2, 0, 3, 1]])
但是我想知道是否有一种不使用任何for循环的解决方法?(我有点假设,如果我的行数大于1000,添加for循环可能会使速度变慢。但是正如您所看到的,我实际上是在创建生成器,a
因此我也不知道它是否有效果毕竟。)
我经常使用的一个技巧是生成一个随机数组,并argsort
用于获取唯一索引作为所需的唯一数字。因此,我们可以-
def random_choice_noreplace(m,n, axis=-1):
# m, n are the number of rows, cols of output
return np.random.rand(m,n).argsort(axis=axis)
样品运行-
In [98]: random_choice_noreplace(3,7)
Out[98]:
array([[0, 4, 3, 2, 6, 5, 1],
[5, 1, 4, 6, 0, 2, 3],
[6, 1, 0, 4, 5, 3, 2]])
In [99]: random_choice_noreplace(5,7, axis=0) # unique nums along cols
Out[99]:
array([[0, 2, 4, 4, 1, 0, 2],
[1, 4, 3, 2, 4, 1, 3],
[3, 1, 1, 3, 2, 3, 0],
[2, 3, 0, 0, 0, 2, 4],
[4, 0, 2, 1, 3, 4, 1]])
运行时测试-
# Original approach
def loopy_app(m,n):
a = (np.random.choice(n,size=n,replace=False) for _ in range(m))
return np.vstack(a)
时间-
In [108]: %timeit loopy_app(1000,100)
10 loops, best of 3: 20.6 ms per loop
In [109]: %timeit random_choice_noreplace(1000,100)
100 loops, best of 3: 3.66 ms per loop
问题内容: 我有一个包含以下内容的表: 我想获取每个单个Seller_id的所有最新行。我可以得到这样的最新行: 如何仅获得每个卖方的最新行? 问题答案: 要获取每个Seller_id的最新记录,您可以使用以下查询 使用查询生成器,您可以将其重写为
问题内容: 我有这张表: 有没有一种方法可以通过密钥分组来获得此结果? 或此结果: 如果我使用此查询: 我知道这是不正确的,因为我应该按需要显示的所有列进行分组。 有解决这个问题的方法吗? 问题答案: 适用于所有数据库引擎的查询将是 min(id)影响您获得结果的功能在哪里?如果您使用max(id),则得到另一个。
问题内容: 我有一张表: 我需要选择具有最大更新值的id和val。因此,对于此表,结果应为: 问题答案: 这需要在与主表连接的子查询中进行汇总。
在oracle DB中检索具有大组最大值的行时遇到问题。 我的桌子看起来是这样的: id,col1,col2,col3,col4,col5,date_col 谢谢你的提示! 干杯
问题内容: 有没有一种方法可以选择某个表的列名,只有那些具有空值的列除外,而不知道该表有多少列。 应导致: 谢谢! 问题答案: 创建具有以下内容的存储过程:
问题内容: 这应该是一个简单的问题,但我无法使其起作用:( 如何按另一列分组选择具有最大列值的行? 例如, 我有以下表格定义: 现在的问题是,我想先按结果分组,然后再从每组中选择一行,具体取决于哪一组具有最高的。 我试过了 但是,与其以正确的方式回报我,不如以同一个小组中最早的回报我。 有任何想法吗? 问题答案: 我本人为此进行了很多次努力,解决方案是以不同的方式考虑您的查询。 我希望其中具有该D