如何通过唯一键拆分数组?

问题描述 投票:1回答:2

我使用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))
python arrays numpy unique element
2个回答
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)

这些解决方案假设每列对应于唯一键。


0
投票

你可以将元素与它们的列式分钟进行比较,然后将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”。

© www.soinside.com 2019 - 2024. All rights reserved.