【问题标题】:How to split up an array by unique keys?如何通过唯一键拆分数组?
【发布时间】:2019-04-09 17:04:24
【问题描述】:

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

【问题讨论】:

  • 那么你的问题到底是什么?你有错误吗?
  • 示例输入和输出以及所需的输出在这里会有所帮助。你的问题有点不清楚。
  • 比较(像对数组的大多数操作一样)是矢量化的,所以函数的最后一行可以是return (x==m).astype(int)

标签: python arrays numpy unique element


【解决方案1】:

这里有很多选项,例如:

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)

这些解决方案假定每一列对应一个唯一的键。

【讨论】:

  • 非常感谢。我将使用 apply_along_axis。太有帮助了,祝福
  • 我将如何指定哪些列对应于唯一键?是否在 arr= 选项中?
  • @SeabassJohn 你看过你的数据框了吗?是否有任何变量(“药物”、“长度”等)重复?如果没有,那就没什么好担心的了。如果有同名的列,我会重命名它们,因为不同变量的名称相同是不好的做法。无论哪种方式,我们都开始在这里讨论一个新问题,而且这个问题本身并不是真正的编程问题。如果此答案(或另一个答案)解决了您的问题中所述的问题,请接受它。如果您有其他问题,请打开一个新问题。
【解决方案2】:

您可以将元素与其按列的分钟数进行比较,然后将大小写为 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”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2022-10-23
    • 2012-03-15
    • 1970-01-01
    • 2019-08-16
    • 2017-09-25
    相关资源
    最近更新 更多