计算沿列/行的1的分数除以1的最小分数

时间:2017-03-19 23:43:16

标签: python arrays python-3.x numpy

我正在尝试创建一个函数calc_frac(a, axis=0),它接受​​一个二维数组并返回每列或每行中1的比例除以具有最小比例的列或行。

所以例如

a = np.array([[1,0,1],[1,1,0],[0,1,0]])
print(calc_frac(a))

应返回[ 2. 2. 1.]因为第3列的比例最小(1/3)所以我将所有比例除以1/3,因为其他列比例是2/3,它们的比例是(2 / 3)/(1/3)= 2。

通过阅读numpy文档,我知道我可以采用这两种方式 - np.sum()np.count_nonzero() ...我明白我需要找到平均值,所以{{1}但是那我怎么能找到最小比例?我会说我在这里使用什么方法有点困惑。

1 个答案:

答案 0 :(得分:1)

你说过你一直坚持解决这个问题的方法。一种可能性是:

import numpy as np

a = np.array([[1,0,1],[1,1,0],[0,1,0]])
axis = 1

# Create a mask where ones are True and zeros False
ones = a == 1
# Sum the number of ones along the axis, using the fact that booleans act like integers
# True = 1, False = 0
onesaxis = np.sum(ones, axis=axis)
# Minimum of the ones along that axis
minaxis = np.min(onesaxis)
# Divide the amount of ones in each axis by the minimum number
result = onesaxis / minaxis

如果你想缩短它,每行放多个语句(方法是相同的):

onesaxis = np.sum(a == 1, axis=axis)
result = onesaxis / np.min(onesaxis)

如果您的数组只包含1和0,则可能不需要a == 1步骤,只需使用数组本身:

onesaxis = np.sum(a, axis=axis)
result = onesaxis / np.min(onesaxis)

虽然有一个警告:您可能需要特殊情况,即一行包含零1 s。否则你会被零除,这几乎是不正确的:

onesaxis = np.sum(a, axis=axis)
minaxis = np.min(onesaxis)
if minaxis == 0:
    raise ValueError() # or something else
result = onesaxis / minaxis
相关问题