Индексация для доступа к элементам матрицы - PullRequest
0 голосов
/ 22 октября 2019

В приведенном ниже примере я создаю idxL и хочу перебрать его элементы для выполнения других операций. Я пытаюсь понять, почему idxL[0][0] возвращает [[ True False False False False]] вместо того, чтобы просто возвращать True. idxL.item(0) похоже на работу. Я думаю, что мог бы пройтись по всему количеству элементов в idxL, используя его. Однако, по некоторым причинам, я думаю, что это не будет столь эффективно, когда я начну работать с большими массивами.

from scipy.sparse import csr_matrix
a=['foo','panda','donkey','bird','egg']
b='foo'
idxL=csr_matrix((1,5), dtype=bool)
idxTemp=np.array(list(map(lambda x: x in b, a)))
idxL = idxL + idxTemp
print(idxL[0][0])
print(idxL.item(0))

Ответы [ 2 ]

1 голос
/ 22 октября 2019
In [193]: from scipy import sparse                                              
In [194]: a=['foo','panda','donkey','bird','egg'] 
     ...: b='foo' 
     ...: idxL=sparse.csr_matrix((1,5), dtype=bool) 
     ...: idxTemp=np.array(list(map(lambda x: x in b, a)))  

Разреженная матрица:

In [195]: idxL                                                                  
Out[195]: 
<1x5 sparse matrix of type '<class 'numpy.bool_'>'
    with 0 stored elements in Compressed Sparse Row format>
In [196]: idxL.A                                                                
Out[196]: array([[False, False, False, False, False]])

плотный массив;обратите внимание, что это 1d

In [197]: idxTemp                                                               
Out[197]: array([ True, False, False, False, False])

Индексирование разреженной матрицы:

In [198]: idxL[0,0]                                                             
Out[198]: False

Добавление - теперь это плотная матрица:

In [199]: idxLL = idxL + idxTemp                                                
In [200]: idxLL                                                                 
Out[200]: matrix([[ True, False, False, False, False]])
In [201]: idxLL[0,0]                                                            
Out[201]: True

[0]из матрицы выбирает первую строку, но результат все равно будет 2d. [0][0] индексация не помогает. Этот стиль индексации работает с 2d ndarray, но [0,0], как правило, лучше.

In [202]: idxLL[0]                                                              
Out[202]: matrix([[ True, False, False, False, False]])
In [203]: idxTemp[0]                                                            
Out[203]: True

edit

Мы можем сделать разреженную матрицу из idxTemp напрямую:

In [257]: M = sparse.csr_matrix(idxTemp)                                        
In [258]: M                                                                     
Out[258]: 
<1x5 sparse matrix of type '<class 'numpy.bool_'>'
    with 1 stored elements in Compressed Sparse Row format>
In [259]: M.A                                                                   
Out[259]: array([[ True, False, False, False, False]])
In [260]: print(M)                                                              
  (0, 0)    True

Нет необходимости добавлять его в idxL. Можно добавить:

In [261]: idxL+M                                                                
Out[261]: 
<1x5 sparse matrix of type '<class 'numpy.bool_'>'
    with 1 stored elements in Compressed Sparse Row format>

Я бы не рекомендовал создавать запасную матрицу, добавляя матрицы.

0 голосов
/ 22 октября 2019

это происходит потому, что idxL - это не np.array, а np.matrix . чтобы превратить это в массив numpy, обратитесь к атрибуту 'A', который возвращает np.array.

import numpy as np
from scipy.sparse import csr_matrix
a=['foo','panda','donkey','bird','egg']
b='foo'
idxL=csr_matrix((1,5), dtype=bool)
idxL.todense()
idxTemp=np.array(list(map(lambda x: x in b, a)))
idxL = idxL + idxTemp
print(idxL.A[0][0])
print(idxL.item(0))

output:
True
True

Редактировать: если вы хотите остаться с разреженным, вы должны изменить свой исходный код на

import numpy as np
from scipy.sparse import csr_matrix
a=['foo','panda','donkey','bird','egg']
b='foo'
idxL=csr_matrix((1,5), dtype=bool)
idxL.todense()
idxTemp=csr_matrix(list(map(lambda x: x in b, a)))
idxL = idxL + idxTemp
print(idxL[0][0])

Теперь idxL по-прежнему csr_matrix и выполняет индексирование [].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...