我有两个矩阵只包含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
1条答案
按热度按时间rqdpfwrv1#
我想你想要matrix multiplication:
或同等产品:
您也可以将
A,B
转换为布尔类型:全部给予
out==145