…这个参考来自一个单独的矩阵。你知道吗
这个问题是前面回答的一个问题的扩展,其中引用元素直接来自与之比较的同一列。一些聪明的排序和引用排序的索引似乎解决了这个问题。你知道吗
广播在原问题和新问题中都有提出。我的内存在n ~ 3000
左右用完,需要再大一个数量级。你知道吗
为了使所提出的解决方案在[SPACE]
-和[TIME]
-域中公平且相互可比,
假设n = 50000; m = 20; k = 50; a = np.random.rand( n, m ); ...
我现在对一个更一般的形式感兴趣,其中参考值来自另一个参考值矩阵。你知道吗
原始问题:
Vectorized pythonic way to get count of elements greater than current element
新问题:我们能否编写一个矢量化的表单来执行以下角色。你知道吗
函数接收2个二维数组作为输入。你知道吗
A = n x m
B = k x m
返回
C = k x m.
C[i,j]
是A[:,j]
中大于B[i,j]
的观测值的比例
这是我令人尴尬的慢双循环实现。你知道吗
import numpy as np
n = 100
m = 20
k = 50
a = np.random.rand(n,m)
b = np.random.rand(k,m)
c = np.zeros((k,m))
for j in range(0,m): #cols
for i in range(0,k): # rows
r = b[i,j]
c[i,j] = ( ( a[:,j] > r).sum() ) / (n)
我认为你可以使用广播:
演示:
支票:
进近#1
我们可以再次使用} 中讨论的那样,但是有点扭曲。我们将第二个数组连接到第一个数组中,然后执行
argsort
技巧,正如在^{argsort-ing
。我们需要对级联数组和第二个数组使用argsort
,并获得所需的输出。这个实现看起来像这样-解释
argsort
来获得第二个数组w.r.t到整个级联数组的相对位置,并使用另一个argsort
来追溯这些索引w.r.t的原始顺序。你知道吗argsort-ing
,以便补偿串联。你知道吗b
中的每个元素,比较:a[:,j] > b[i,j]
。现在,这些索引顺序是基于0的,即接近0
的索引表示a[:,j]
中的元素数大于当前元素b[i,j]
,因此计数更大,反之亦然。因此,我们需要从a[:,j]
的长度中减去这些索引,得到最终的输出。你知道吗方法#1-改善
我们将通过使用
array-assignment
来进一步优化它,同样是受到来自同一解决方案的Approach #2
的启发。因此,这些arg输出:b_argoffset
和total_args
可以交替计算,就像这样-进近#2
我们还可以利用^{} 实现一种完全不同的方法-
解释
a
的每一列的排序顺序索引。你知道吗b
放入排序后的a
中,使用searcshorted
。这与{请注意,这些方法为我们提供了计数。因此,对于最终的输出,将得到的输出除以
n
。你知道吗相关问题 更多 >
编程相关推荐