我使用min函数找到数组“value”中的最小值。最低值分配为1,其他全部为0.我有几个描述性的列变量:药物,大小,强度,形式,时间。我想找到每个唯一键的最小值,而不是整个数组“值”中的最小值。
我试过为每个列变量运行循环。
def min_mask(arr):
m = np.min(arr)
return np.vectorize(lambda x: x == m)(arr).astype(int)
if __name__ == '__main__':
my_arr = np.array(meltDF["value"])
print(min_mask(my_arr))
这里有很多选择,例如:
1)预初始化面具并使用argmin
填写适当的位置:
arr = np.random.rand(10, 4)
indices = np.argmin(arr, axis=0)
mask = np.zeros_like(arr, dtype=np.int)
mask[indices, range(len(indices))] = 1
2)使用apply_along_axis
可能是你喜欢的风格:
def is_minimum(v):
return v == np.min(v)
mask = np.apply_along_axis(is_minimum, axis=0, arr=arr).astype(np.int)
这些解决方案假设每列对应于唯一键。
你可以将元素与它们的列式分钟进行比较,然后将case与uint8进行比较以节省一些空间:
>>> import numpy as np
>>> np.random.seed(444)
>>> arr = np.random.rand(10, 4)
>>> (arr == arr.min(axis=0)).astype(np.uint8)
array([[0, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 0],
[0, 0, 1, 0]], dtype=uint8)
由于NumPy的broadcasting,比较arr == arr.min(axis=0)
将产生与arr
相同形状的结果,即使arr.min(axis=0)
将具有形状(4,)
。
请注意,如果列具有重复的最小值,则可能会在单个列中生成多个“1”。