我有下面的Python片段来计算元素xy(来自XY)同时验证条件x<=iy<=j的次数,其中ij是索引:

import numpy as np

X = np.array([ 8,  7,  9,  5,  3,  2,  4, 10,  6,  1])
Y = np.array([ 1,  3, 10,  9,  5,  7,  8,  2,  6,  4])

n = len(X)

count = 0
expected_count = 0

for i in range(n):
    for j in range(n):
        count += np.sum((X <= (i+1)) & (Y <= (j+1)))
        expected_count += (i + 1) * (j + 1) / n

它工作正常,但出于性能考虑,我想矢量化这个操作.

我知道

i_ = np.arange(1, n+1)
j_ = np.arange(1, n+1)
m_ = i_[:, None] * j_[None, :]

生成一个nxn矩阵m_,其元素和将返回expected_count,似乎也是一种方法go count.但我缺乏更多的NumPy知识来实现条件.

如何实现这一点,特别是在这种情况下矢量化(X <= (i+1)) & (Y <= (j+1))操作?

推荐答案

您可以使用:用途:

count = ((X <= i_[:,None]) & (Y  <= j_[:,None])[:,None]).sum()
count
285

expected_count = m_.sum()/n
302.5

似乎有一个数学关系你正在做的事情:

try

((n + 1 - Y) * (n + 1 - X)).sum()
285

简化上面的等式,并假设Y和X包含值1的事实... n,我们得到的是表达式sum(X * Y)

sum(X * Y)
285

X @ Y
285

还请注意,期望值可以很容易地使用数学公式计算.sum(X)* sum(Y)/n = [n(n+1)/2]**2/n = n(n+1)**2/4

n*(n + 1)**2/4
302.5

Python相关问答推荐

根据条件将新值添加到下面的行或下面新创建的行中

如何在Django基于类的视图中有效地使用UTE和RST HTIP方法?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

关于Python异步编程的问题和使用await/await def关键字

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

Polars asof在下一个可用日期加入

Polars将相同的自定义函数应用于组中的多个列,

寻找Regex模式返回与我当前函数类似的结果

pysnmp—lextudio使用next()和getCmd()生成器导致TypeError:tuple对象不是迭代器''

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

Discord.py -

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

将链中的矩阵乘法应用于多组值

统计numpy. ndarray中的项目列表出现次数的最快方法

根据Pandas中带条件的两个列的值创建新列

利用SCIPY沿第一轴对数组进行内插

在round函数中使用列值

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

BeatuifulSoup从欧洲志愿者服务中获取数据和解析:一个从EU-Site收集机会的小铲子

对当前的鼹鼠进行编码,并且我的按键获得了注册