我有两个numpy矩阵A和B两者都是数字矩阵,仅由条目0或1组成.

我想从这两个矩阵计算矩阵积C,该矩阵在A(行、列)方面遵守以下规则:

If A(i,j) = 1 and B(i,j)=1, C(i,j)=1.
If A(i,j) = 1 and B(i,j)=0, C(i,j)=-q.
If A(i,j) = 0, C(i,j) = 0, regardless of the value of B(i,j).

其中q满足方程p-(n-p)*q=0,其中p是B(i,:)中1的数量.

我可以用几个for循环来实现这个逻辑,但我很想问是否有一种单行Python方法来实现这个逻辑.

推荐答案

IIUC您可以做:

假设您有两个矩阵5x 2:

# A
[[0 1 0 1 1]
 [1 1 1 1 0]]

# B
[[0 0 1 1 1]
 [0 0 1 1 0]]

然后:

m, n = A.shape            # 5, 2
p = B.sum(axis=1)         # [3 2]
q = p / (n - p)           # [1.5        0.66666667]

m1 = A & B
m2 = (A & ~B) * -q[:, None]

print(m1 + m2)

输出:

[[ 0.         -1.5         0.          1.          1.        ]
 [-0.66666667 -0.66666667  1.          1.          0.        ]]

Python相关问答推荐

定义同侪组并计算同侪组分析

CustomTKinter-向表单添加额外的输入字段

Django注释:将时差转换为小数或小数

有没有方法可以修复删除了换码字符的无效的SON记录?

过滤绕轴旋转的螺旋桨

ambda将时间戳与组内另一列的所有时间戳进行比较

在使用Guouti包的Python中运行MPP模型时内存不足

使文本输入中的文本与标签中的文本相同

如果索引不存在,pandas系列将通过索引获取值,并填充值

如何使用symy打印方程?

Pandas 滚动最接近的价值

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

2D空间中的反旋算法

大小为M的第N位_计数(或人口计数)的公式

根据二元组列表在pandas中创建新列

如何在Python脚本中附加一个Google tab(已经打开)

在极性中创建条件累积和

从spaCy的句子中提取日期

在Python中,从给定范围内的数组中提取索引组列表的更有效方法

如何防止Pandas将索引标为周期?