Разбить массив NumPy в соответствии со значениями в массиве (условие)

У меня есть массив:

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 Solutions collect form web for “Разбить массив NumPy в соответствии со значениями в массиве (условие)”

Я не могу придумать каких-либо numpy функций или трюков для этого. Простым решением, использующим для цикла, было бы –

 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)]] 

Вот краткая идея, работающая с массивом 1d. Он может быть легко расширен для работы с вашим 2d-массивом:

 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 найти indecies, где вы хотите split .


Для 2d arr

Сначала сделайте образец 2d массива, с чем-то интересным в третьем столбце:

 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 и boolean, чтобы найти индексы для разделения:

 In [393]: I=np.where(arr[:,2]%3==0) In [395]: np.split(arr,I[0]) Out[395]: [array([], dtype=float64), array([[ 1., 1., 0.], [ 1., 1., 1.], [ 1., 1., 2.]]), array([[ 1., 1., 3.], [ 1., 1., 4.], [ 1., 1., 5.]]), array([[ 1., 1., 6.], [ 1., 1., 7.], [ 1., 1., 8.]]), array([[ 1., 1., 9.]])] 

От взгляда на документацию кажется, что указатель индекса того, где разделить, будет работать лучше всего. Для вашего конкретного примера следующее работает, если arr уже является 2-мерным массивом numpy:

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

arr[:,2] возвращает список третьей записи в каждом кортеже. Двоеточие говорит, чтобы взять каждую строку, и 2 говорит, чтобы взять 3-й столбец, который является третьим компонентом.

Затем мы используем np.where чтобы вернуть все места, где 3-я координата равна 1. Мы должны сделать np.where()[0] чтобы напрямую попасть в массив местоположений.

Затем мы подключаем найденные индексы, где 3-я координата равна 1 на np.split, которая разбивается на нужные места.

Обратите внимание, что поскольку первая запись имеет 1 в 3-й координате, она будет разделяться до первой записи. Это дает нам один дополнительный «split» массив, который пуст.

Python - лучший язык программирования в мире.