我正在尝试创建一个函数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}但是那我怎么能找到最小比例?我会说我在这里使用什么方法有点困惑。
答案 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