python - 根据元素拆分 Numpy 数组,其中数组的每个元素都是唯一的

标签 python numpy vector split

我有一个 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

的结果加 +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])]

关于python - 根据元素拆分 Numpy 数组,其中数组的每个元素都是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52906951/

相关文章:

查找列表中出现次数最少的对象的 Pythonic 方法

python - 查找由不规则数据点定义的体积 - python

python - 打乱 2D numpy 数组中的位置列表,然后使用它在 3D numpy 数组中进行选择(或切片)

java - 需要建议 : A programmatic way for creating vector graphics with heavy usage of text

java - 从 vector < vector <字符串>>动态更新JTable

c++ - 用 vector C++ 中的随机数替换元素

python - 将字符串 'abcde' 拆分为具有单独元素的列表

python - 从 DJango 中的 HTML 模板访问数据库模型

python - 将 numpy 安装到目录后,AWS Lambda 中缺少必需的依赖项 ['numpy' ],如何修复?

python - 在 python 中使用 for 循环将两个列表切片为具有相同的大小