2016-02-24 4 views
2

Следующий код дает мне, сколько раз элементы в (0-11) встречаются в первой строке массива c. (А == с [0]). Как я могу настроить этот код, чтобы он также делал то же самое для всех строк в c, а не только c [0]. По существу цикл for.Numpy broadcasting

import numpy as np 
c=(np.random.rand(2,5)*12).round() 
print (c) 

a=np.arange(12).reshape(12,1) 
print (np.sum(a==c[0],axis=1)) 

Результат должен выглядеть следующим образом, но без цикл:

for n in range(2): 
    a=np.arange(12).reshape(12,1) 
    print (np.sum(a==c[n],axis=1)) 

ответ

1

Если вы должны использовать broadcasting, что бы навлечь тяжелое использование памяти, вы можете сделать -

(c[...,None] == np.arange(12)).sum(1) 

Для большего размера c лучшим способом было бы не беспокоить c и просто передвигаться np.arange(12), так же -

(c == (np.arange(12)[:,None,None])).sum(-1).T 

Вот некоторые доказательства на этой теории -

In [28]: c=(np.random.rand(2000,5000)*12).round() 

In [29]: %timeit (c[...,None] == np.arange(12)).sum(1) 
1 loops, best of 3: 423 ms per loop 

In [30]: %timeit (c == (np.arange(12)[:,None,None])).sum(-1).T 
1 loops, best of 3: 232 ms per loop 
+0

ничего себе удивительно! Что за ... стоит? Я ничего не могу найти в doc – Nickpick

+0

@nickpick Я называю это - Бросьте все на фронт. Таким образом, в основном толкает все dims на фронт и, таким образом, по сути является таким же, как 'c [:,:, None]' для этого случая. – Divakar

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