2013-12-20 6 views
2

Я пытаюсь динамически построить 2-D матрицу с NumPy на основе значений массива, например:Динамически заполнять матрицу numpy из значений массива?

In [113]: A = np.zeros((5,5),dtype=bool) 
In [114]: A 
Out[114]: array([[False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False], 
    [False, False, False, False, False]], dtype=bool) 

In [116]: B = np.array([0,1,3,0,2]) 

In [117]: B 
Out[117]: array([0, 1, 3, 0, 2]) 

Теперь я хотел бы использовать значение из B, чтобы присвоить первый n значений каждой строки от А до Истины. Для этого A и B, правильный результат будет:

In [118]: A 
Out[118]: array([[False, False, False, False, False], 
    [ True, False, False, False, False], 
    [ True, True, True, False, False], 
    [False, False, False, False, False], 
    [ True, True, False, False, False]], dtype=bool) 

Длина B всегда будет равно числу строк матрицы А, а значения B всегда будет меньше или равно числу столбцы A. Размер A и значения B постоянно меняются, поэтому мне нужно построить их на лету.

Я уверен, что у этого есть простое (-ish) решение в numpy, но я провел последний час, ударяя головой о вариации повтора, плитки и всего остального, о чем я могу думать. Может ли кто-нибудь помочь мне, прежде чем я дам себе сотрясение мозга? :)

EDIT: Мне нужно будет сделать это много, поэтому скорость будет проблемой. Единственный вариант, который я могу придумать сейчас что-то вроде:

np.vstack([ [True]*x + [False]*(500-x) for x in B ]) 

, но я ожидаю, что это будет медленным из-за цикл (я бы время это, если бы я не имел ничего, чтобы сравнить его с).

ответ

3

Как насчет: (. Я изменил форму из (5,5), потому что я путаться, о котором ось которого был, и я хотел убедиться, что я использую правильный)

>>> A = np.zeros((5, 7),dtype=bool) 
>>> B = np.array([0,1,3,0,2]) 
>>> (np.arange(len(A[0])) < B[:,None]) 
array([[False, False, False, False, False, False, False], 
     [ True, False, False, False, False, False, False], 
     [ True, True, True, False, False, False, False], 
     [False, False, False, False, False, False, False], 
     [ True, True, False, False, False, False, False]], dtype=bool) 

[Упрощенные из (np.arange(len(A[0]))[:,None] < B).T. - если разложить B и не A, нет никакой необходимости в транспонированном]

+1

Сладкого Рождества, это хорошо! И быстро тоже ... спасибо! – Winawer

+0

Обратите внимание, что вам не нужно фактически создавать 'A'-- Я только сделал это, чтобы проверить форму. Все, что вам нужно, это число 'len (A [0])' и 'B'. – DSM

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