2 回答
TA贡献1895条经验 获得超7个赞
您可以将元素与其列式分钟进行比较,然后将大小写为 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 的广播,比较arr == arr.min(axis=0)会产生与 的形状相同的结果arr,即使arr.min(axis=0)会有形状(4,)。
请注意,如果列有重复的最小值,这可能会在单个列中生成多个“1”。
TA贡献1853条经验 获得超9个赞
这里有很多选项,例如:
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) Usingapply_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)
这些解决方案假设每一列对应一个唯一的键。
添加回答
举报