我有一个数组:
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应该可以解决这个问题,但我对于如何编写拆分条件感到很遗憾。
答案 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,所以它将在第一个条目之前分割。这给了我们一个额外的"分裂"数组是空的。