根据数组中的值拆分NumPy数组(条件)

时间:2015-07-17 20:08:40

标签: python arrays numpy split

我有一个数组:

    arr = [(1,1,1), (1,1,2), (1,1,3), (1,1,4)...(35,1,22),(35,1,23)]

我想根据每个有序对中的第三个值来分割我的数组。我希望每个第三个值为1 一个新的阵列。结果应该是:

    [(1,1,1), (1,1,2),...(1,1,35)][(1,2,1), (1,2,2),...(1,2,46)]

等等。我知道numpy.split应该可以解决这个问题,但我对于如何编写拆分条件感到很遗憾。

3 个答案:

答案 0 :(得分:2)

这是一个快速的想法,使用1d数组。它可以很容易地扩展到使用你的2D阵列:

mAppBarLayout.setElevation(0);

关键是使用In [385]: x=np.arange(10) In [386]: I=np.where(x%3==0) In [387]: I Out[387]: (array([0, 3, 6, 9]),) In [389]: np.split(x,I[0]) Out[389]: [array([], dtype=float64), array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([9])] 查找您希望where采取行动的内容。

对于2d arr

首先制作一个样本2d数组,第3列中有一些有趣的内容:

split

然后使用相同的In [390]: arr=np.ones((10,3)) In [391]: arr[:,2]=np.arange(10) In [392]: arr Out[392]: array([[ 1., 1., 0.], [ 1., 1., 1.], ... [ 1., 1., 9.]]) 和布尔值来查找要拆分的索引:

where

答案 1 :(得分:0)

我无法想到任何numpy功能或技巧来做到这一点。使用for循环的简单解决方案是 -

In [48]: arr = [(1,1,1), (1,1,2), (1,1,3), (1,1,4),(1,2,1),(1,2,2),(1,2,3),(1,3,1),(1,3,2),(1,3,3),(1,3,4),(1,3,5)]

In [49]: result = []

In [50]: for i in arr:
   ....:     if i[2] == 1:
   ....:         tempres = []
   ....:         result.append(tempres)
   ....:     tempres.append(i)
   ....:

In [51]: result
Out[51]:
[[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4)],
 [(1, 2, 1), (1, 2, 2), (1, 2, 3)],
 [(1, 3, 1), (1, 3, 2), (1, 3, 3), (1, 3, 4), (1, 3, 5)]]

答案 2 :(得分:0)

documentation看,似乎指定拆分位置的索引效果最好。对于您的具体示例,如果arr已经是2维的numpy数组,则以下工作:

np.split(arr, np.where(arr[:,2] == 1)[0])

arr[:,2]返回每个元组中第3个条目的列表。冒号说要占据每一行,2说要取第3列,这是第3部分。

然后我们使用np.where返回第3个坐标为1的所有位置。我们必须np.where()[0]直接获取位置数组。

然后我们插入我们发现的第三个坐标为1到np.split的索引,它们在所需的位置分割。

请注意,因为第一个条目在第三个坐标中的值为1,所以它将在第一个条目之前分割。这给了我们一个额外的"分裂"数组是空的。