numpy 矩阵元素匹配比较的向量化方法

kxxlusnw  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(87)

我有两个矩阵只包含1和0:
A,形状n × m。
B,形状n × o。
从概念上讲,“n”行表示包含产品“m”和服务客户位置“o”的设施。
我想对至少由一个设施“n”服务的客户“o”和产品“m”的每个组合进行计数。
这不像做简单的求和那么容易,因为我没有把整个数据结构加起来。相反,我把每个“o”和“m”组合至少有设施(而不是总设施)的次数加起来。
我已经成功地做到了这一点,通过循环B的列,广播乘法,求和行,然后求和,检查每行的和是否> 0。
然而,循环是不好的,这感觉像是numpy可以用向量化的方式做的事情。我已经研究了np.stack和np. meshgrid。似乎对我都不起作用。
有没有什么好主意,如果/如何矢量化这个?
这是我的循环解决方案。正确答案是145。

import numpy as np

A = np.array(
    [[1., 0., 1., 1., 1., 0., 1., 1., 1., 1.],
    [0., 0., 1., 1., 0., 1., 1., 0., 0., 1.],
    [0., 1., 1., 0., 0., 1., 0., 0., 1., 1.],
    [0., 0., 0., 0., 0., 1., 0., 1., 0., 0.],
    [0., 0., 1., 1., 0., 0., 0., 0., 0., 1.]]
)

print(A.shape)
A

B = np.array(
    [[0., 1., 0., 0., 1., 0., 1., 1., 0., 1., 0., 1., 1., 0., 1., 0., 0., 0., 1., 1.],
    [1., 0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 1., 1.],
    [0., 1., 1., 0., 1., 0., 0., 1., 0., 0., 0., 1., 1., 1., 1., 0., 0., 1., 0., 0.],
    [0., 1., 1., 1., 1., 0., 0., 1., 1., 1., 1., 1., 1., 0., 0., 0., 1., 0., 0., 0.],
    [1., 1., 0., 1., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 1., 0., 1., 1., 0., 1.]]
)

print(B.shape)
B

def count_conditions(A: np.ndarray, B: np.ndarray):
    # Inputs are all 0 or 1.
    assert np.all((A == 0) | (A == 1))
    assert np.all((B == 0) | (B == 1))
    
    running_total = 0
    
    for col in range(B.shape[1]):
        # Select column and broadcast multiply.
        this_broadcast = A.T * B[:,col]
        # Sum each row.
        row_sums = np.sum(this_broadcast, axis=1)
        # Count how many rows had at least one.
        running_total += np.sum(row_sums > 0)
    
    return running_total

result = count_conditions(A=A, B=B)

print(result)
assert result == 145
rqdpfwrv

rqdpfwrv1#

我想你想要matrix multiplication

out = (A.T @ B).astype(bool).sum()

或同等产品:

out = (A.T @ B > 0).sum()

您也可以将A,B转换为布尔类型:

out = (A.astype(bool).T @ B.astype(bool)).sum()

全部给予out==145

相关问题