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

时间:2019-04-09 17:04:25

标签: python arrays numpy unique element

我正在使用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))

2 个答案:

答案 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”。