Удаление строк в массиве np внутри цикла for - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь удалить все строки, в которых есть один или менее ненулевых элементов, в нескольких двумерных массивах, содержащихся в списке 'a'.

Этот метод работает, когда я запускаю его вне цикла 'i', но не в целом. Я знаю, что не могу удалить строки, по которым я выполняю итерации, но я полагаю, что я не делаю этого в этом случае, потому что я только удаляю строки в массивах, содержащихся в a, а не в самих массивах.

for i in range(len(a)):
  del_idx=[]
  for j in range(len(a[i])):
    nonzero=np.nonzero(a[i][j])
    nonzero_len=len(nonzero[0]) #because np.nonzero outputs a tuple
    if nonzero_len<=1:
        del_idx.append(j)
    else:
        continue
  np.delete(a[i],(del_idx),axis=0)

Кто-нибудь знает, что здесь происходит? Если это действительно не работает, как я могу удалить эти элементы без использования цикла? Это Python 2.7

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать np.where() для индексации:

a = np.random.randint(0, 2, size=(10,10))
# array([[1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
#    [1, 0, 0, 0, 1, 1, 1, 1, 0, 1],
#    [1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
#    [1, 0, 0, 1, 0, 1, 0, 1, 1, 0],
#    [1, 0, 0, 0, 1, 0, 1, 1, 0, 1],
#    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
#    [1, 0, 0, 1, 1, 0, 0, 1, 1, 0],
#    [0, 0, 0, 1, 0, 1, 0, 1, 1, 1],
#    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0],
#    [1, 1, 0, 0, 0, 1, 0, 0, 1, 1]])

np.where(np.count_nonzero(a, axis=1)<5)    # In your case, should be > 1
# (array([2, 5, 8]),)

a[np.where(np.count_nonzero(a, axis=1)<5)] # Returns the array you wanted
# array([[1, 0, 1, 0, 0, 1, 0, 0, 0, 1],
#    [0, 0, 1, 1, 1, 0, 1, 0, 0, 0],
#    [0, 0, 1, 1, 0, 0, 1, 0, 1, 0]])
0 голосов
/ 02 ноября 2018

Вы должны стремиться избегать циклов for с NumPy, когда доступны векторизованные операции. Здесь, например, вы можете использовать логическое индексирование:

import numpy as np

np.random.seed(0)

A = np.random.randint(0, 2, (10, 3))

res = A[(A != 0).sum(1) > 1]

array([[0, 1, 1],
       [0, 1, 1],
       [1, 1, 1],
       [1, 1, 0],
       [1, 1, 0],
       [0, 1, 1],
       [1, 1, 0]])

Та же логика может применяться для каждого массива в вашем списке массивов.

...