我有一个 Numpy 1D 向量,例如 x = [1, 1, 1, 2, 2, 1, 3, 3, 1]
我必须将其分割成 n 个子数组,其中每个向量必须以新值开始,并且只要值相同就继续,这样最终的答案是 [[1, 1 , 1], [2, 2], [1], [3, 3], [1]]
。
我确实知道我必须使用 numpy.split()
函数,但我在找到必须进行拆分的位置时遇到问题。
恳请您的帮助,感谢您的宝贵时间!
最佳答案
您只需为 numpy.split
提供分割数组所需的索引
a = np.array([1,1,1,2,2,1,3,3,1])
np.split(a, np.argwhere(np.diff(a) != 0)[:,0] + 1)
# [array([1, 1, 1]), array([2, 2]), array([1]), array([3, 3]), array([1])]
<小时/>
详细信息
使用np.diff(a)
你可以得到每个连续元素之间的差异
np.diff(a)
# array([ 0, 0, 1, 0, -1, 2, 0, -2])
差值不等于0的点是元素不连续相同的点。由于您正在寻找需要进行更改的索引 np.diff(a) != 0
,它返回:
np.diff(a) != 0
# array([False, False, True, False, True, True, False, True])
要将 bool 值转换为索引,您可以使用 np.argwhere
np.argwhere(np.diff(a) != 0)
# array([[2],[4],[5],[7]])
# since we only need this for 1d arrays
np.argwhere(np.diff(a) != 0)[:,0]
# array([2, 4, 5, 7])
您只需使用上述过程为np.split
提供正确的索引
np.split(a, np.argwhere(np.diff(a) != 0)[:,0])
# [array([1, 1]), array([1, 2]), array([2]), array([1, 3]), array([3, 1])]
糟糕...索引错误...看来我们偏离了 1 个索引。没问题,只需将 np.argwhere
np.split(a, np.argwhere(np.diff(a) != 0)[:,0] + 1)
# [array([1, 1, 1]), array([2, 2]), array([1]), array([3, 3]), array([1])]
关于python - 根据元素拆分 Numpy 数组,其中数组的每个元素都是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52906951/