2016-09-01 4 views
1

Я пытаюсь получить длину повторяющихся чисел в Python Numpy. Например, давайте рассмотрим простой ndarrayКак получить длину столбца с повторяющимися номерами?

import numpy as np 

a = np.array([ 
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [1, 0, 1, 0, 0, 1, 1, 1, 0, 1], 
    [0, 1, 0, 1, 0, 1, 0, 0, 1, 0], 
    [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
]) 

Первый столбец имеет [0, 1, 0, 1], положение 1 является 1, теперь начинают считать оттуда, мы получаем ones = 2 и zeros = 1. Поэтому я должен начать отсчет ones и zeros, когда встречается 1 (начальная позиция).

поэтому ответ на a будет

ones = [2, 2, 1, 1, 1, 3, 2, 2, 1, 1] 
zeros = [1, 0, 2, 1, 0, 0, 1, 1, 1, 2] 

Может ли одна просьба помочь мне?

Update

3D массив:

a = np.array([ 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
     [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
    ], 
    [ 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
     [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
     [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
    ] 
]) 

Ожидаемый результат должен быть

ones = [ 
     [2, 3, 0, 0, 1, 3, 2, 2, 1, 0], 
     [1, 3, 0, 2, 1, 1, 1, 2, 1, 1] 
     ] 
zeros = [ 
      [1, 0, 0, 0, 0, 0, 1, 1, 1, 0], 
      [0, 0, 0, 0, 2, 0, 0, 0, 2, 2] 
     ] 
+0

Всегда ли было 0 и 1 в 'a' или могли бы быть и другие номера? – Divakar

+0

@ Дивакар всегда 0 или 1 – Akshay

ответ

4

С акцентом на производительность, вот один общий подход к ndarrays -

ones_count = a.sum(-2) 
zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 

Один из вариантов, чтобы получить zeros_count с выборов с помощью np.where, будет -

zeros_count = np.where(a.any(-2),a.shape[-2] - ones_count - a.argmax(-2),0) 

Sample работает

2D случай:

In [60]: a 
Out[60]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [1, 0, 1, 0, 0, 1, 1, 1, 0, 1], 
     [0, 1, 0, 1, 0, 1, 0, 0, 1, 0], 
     [1, 1, 0, 0, 1, 1, 1, 1, 0, 0]]) 

In [61]: ones_count = a.sum(-2) 
    ...: zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 
    ...: 

In [62]: ones_count 
Out[62]: array([2, 2, 1, 1, 1, 3, 2, 2, 1, 1]) 

In [63]: zeros_count 
Out[63]: array([1, 0, 2, 1, 0, 0, 1, 1, 1, 2]) 

3D случай:

In [65]: a = np.array([ 
    ...:  [ 
    ...:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    ...:   [1, 1, 0, 0, 0, 1, 1, 1, 0, 0], 
    ...:   [0, 1, 0, 0, 0, 1, 0, 0, 1, 0], 
    ...:   [1, 1, 0, 0, 1, 1, 1, 1, 0, 0], 
    ...:  ], 
    ...:  [ 
    ...:   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    ...:   [0, 1, 0, 0, 1, 0, 0, 0, 1, 1], 
    ...:   [0, 1, 0, 1, 0, 0, 0, 1, 0, 0], 
    ...:   [1, 1, 0, 1, 0, 1, 1, 1, 0, 0], 
    ...:  ] 
    ...: ]) 

In [66]: ones_count = a.sum(-2) 
    ...: zeros_count = (a.shape[-2] - ones_count - a.argmax(-2))*a.any(-2) 
    ...: 

In [67]: ones_count 
Out[67]: 
array([[2, 3, 0, 0, 1, 3, 2, 2, 1, 0], 
     [1, 3, 0, 2, 1, 1, 1, 2, 1, 1]]) 

In [68]: zeros_count 
Out[68]: 
array([[1, 0, 0, 0, 0, 0, 1, 1, 1, 0], 
     [0, 0, 0, 0, 2, 0, 0, 0, 2, 2]]) 

и так далее для более тусклых массивов.

+0

Да! что решает проблему. Спасибо. – Akshay

+0

Итак, если у меня есть 3D-массив, мне просто нужно определить функцию и поместить ее в цикл. правильно? или существует эффективный способ? – Akshay

+1

@akshay Я бы подумал, что вам просто нужно изменить все эти '0'' на' 1'', ​​то есть 'a.sum (1)', 'a.shape [1]' и 'a.argmax (1)' в зависимости от как вы интерпретируете «2D' срезы из этого трехмерного массива. – Divakar

Смежные вопросы