Python:基于数组中的值拆分NumPy数组

21

我有一个大数组:

[(1.0, 3.0, 1, 427338.4297000002, 4848489.4332)
 (1.0, 3.0, 2, 427344.7937000003, 4848482.0692)
 (1.0, 3.0, 3, 427346.4297000002, 4848472.7469) ...,
 (1.0, 1.0, 7084, 427345.2709999997, 4848796.592)
 (1.0, 1.0, 7085, 427352.9277999997, 4848790.9351)
 (1.0, 1.0, 7086, 427359.16060000006, 4848787.4332)]
我想要根据数组中第二个值(3.0、3.0、3.0...1.0、1.0、10)将此数组拆分成多个数组。
每当第二个值更改时,我都希望有一个新的数组,因此基本上每个新数组都具有相同的第二个值。我在 Stack Overflow 上搜索了这个问题并知道了命令。
np.split(array, number)

但我不是想将数组分割成特定数量的数组,而是通过一个值来分割。我该如何按照上述方式分割数组呢?任何帮助都将不胜感激!


还有Pandas的groupby:https://dev59.com/-5Dea4cB1Zd3GeqPie1_ - Ciro Santilli OurBigBook.com
1个回答

28
你可以使用numpy.wherenumpy.diff函数来找到值不同的索引,这些函数应用在第一列上:
>>> arr = np.array([(1.0, 3.0, 1, 427338.4297000002, 4848489.4332),
 (1.0, 3.0, 2, 427344.7937000003, 4848482.0692),
 (1.0, 3.0, 3, 427346.4297000002, 4848472.7469),
 (1.0, 1.0, 7084, 427345.2709999997, 4848796.592),
 (1.0, 1.0, 7085, 427352.9277999997, 4848790.9351),
 (1.0, 1.0, 7086, 427359.16060000006, 4848787.4332)])
>>> np.split(arr, np.where(np.diff(arr[:,1]))[0]+1)
[array([[  1.00000000e+00,   3.00000000e+00,   1.00000000e+00,
          4.27338430e+05,   4.84848943e+06],
       [  1.00000000e+00,   3.00000000e+00,   2.00000000e+00,
          4.27344794e+05,   4.84848207e+06],
       [  1.00000000e+00,   3.00000000e+00,   3.00000000e+00,
          4.27346430e+05,   4.84847275e+06]]),
 array([[  1.00000000e+00,   1.00000000e+00,   7.08400000e+03,
          4.27345271e+05,   4.84879659e+06],
       [  1.00000000e+00,   1.00000000e+00,   7.08500000e+03,
          4.27352928e+05,   4.84879094e+06],
       [  1.00000000e+00,   1.00000000e+00,   7.08600000e+03,
          4.27359161e+05,   4.84878743e+06]])]

解释:

首先,我们将获取第二列中的前两个项目:

>>> arr[:,1]
array([ 3.,  3.,  3.,  1.,  1.,  1.])

现在要找出物品实际更改的位置,我们可以使用numpy.diff

>>> np.diff(arr[:,1])
array([ 0.,  0., -2.,  0.,  0.])

任何非零的东西都意味着它旁边的项是不同的,我们可以使用numpy.where来找到非零项的索引,然后加1,因为这样的项的实际索引比返回的索引大1:

>>> np.where(np.diff(arr[:,1]))[0]+1
array([3])

我遇到了一个 IndexError: Too many indices for array 的错误。你知道问题出在哪里吗?感谢你的帮助! - whent1991
@whent1991 你能发布实际的数组吗? - Ashwini Chaudhary
我发布的是实际数组,但它是一个非常大的数组,所以在数组中间有“...”。 - whent1991
嗨,这个解决方案很好用,但是您能解释一下 (np.diff(arr[:,1])))[0]+1 是什么吗?由于我很新手,所以语法有些让我困惑。感谢您的帮助! - whent1991
1
@whent1991 添加了一些解释。 - Ashwini Chaudhary
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接