我正在使用min函数在数组“值”中找到最小值。最小值分配为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))
答案 0 :(得分:0)
这里有很多选项,例如:
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)
这些解决方案假定每一列都对应一个唯一键。
答案 1 :(得分:0)
您可以将元素与其按列的分钟数进行比较,然后对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”。