Numpy - почему ошибка значения для NaN при попытке удалить строки - PullRequest
0 голосов
/ 06 октября 2010

У меня есть массив numpy:

A = array([['id1', '1', '2', 'NaN'],
           ['id2', '2', '0', 'NaN']])

У меня также есть список:

li = ['id1', 'id3', 'id6']

Я хочу перебрать массив и список, где первый элемент в каждой строке массива отсутствует в списке, а затем удалить всю эту строку из массива.

Мой код на сегодняшний день:

from numpy import *

for row in A:
    if row[0] not in li:
        delete(A, row, axis = 0)

Возвращает следующую ошибку:

ValueError: invalid literal for int() with base 10: 'NaN'

Тип всех элементов в каждой строке - str (), поэтому я не понимаю упоминания о int () в ошибке.

Есть предложения?

Спасибо, S; -)

Ответы [ 2 ]

5 голосов
/ 06 октября 2010

Просто генерация нового массива не вариант?

numpy.array([x for x in A if x[0] in li])
2 голосов
/ 06 октября 2010

Похоже, вы хотите удалить строку вашего массива на месте , однако это невозможно с использованием функции np.delete, так как такая операция идет против способ, которым Python и Numpy управляют памятью.

Я нашел интересную запись в списке рассылки Numpy ( Трэвис Олифант, [Numpy-обсуждение] Удаление строки из матрицы ), где впервые обсуждается функция np.delete:

Итак, «удаление на месте» массива объекты не будут особенно полезно, потому что это будет работать только для массивы без дополнительной ссылки рассчитывает (то есть простое b = назначение увеличит количество ссылок и лишить возможности произносить del a [obj]).

....

Но проблема с обоими подходы в том, что как только вы начинаете удаление произвольных строк (или n-1 размерные подпространства) из массива вы, скорее всего, больше не будете иметь кусок памяти, который можно описать используя память n-мерного массива модель.

Если вы посмотрите на документацию для np.delete (http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html),, мы увидим, что функция возвращает массив new с удалением нужных частей (не обязательно строк).

Definition:       np.delete(arr, obj, axis=None)
Docstring:
Return a new array with sub-arrays along an axis deleted.

Parameters
----------
arr : array_like
  Input array.
obj : slice, int or array of ints
  Indicate which sub-arrays to remove.
axis : int, optional
  The axis along which to delete the subarray defined by `obj`.
  If `axis` is None, `obj` is applied to the flattened array.

Returns
-------
out : ndarray
    A copy of `arr` with the elements specified by `obj` removed. Note
    that `delete` does not occur in-place. If `axis` is None, `out` is
    a flattened array.

Итак, в вашем случае, я думаю, вы захотите сделать что-то вроде:

A = array([['id1', '1', '2', 'NaN'],
           ['id2', '2', '0', 'NaN']])

li = ['id1', 'id3', 'id6']

for i, row in enumerate(A):
    if row[0] not in li:
        A = np.delete(A, i, axis=0)

A теперь вырубается, как вы хотели, но помните, что это новый кусок памяти. Каждый раз, когда вызывается np.delete, выделяется новая память, на которую будет указывать имя A.

Я уверен, что есть лучший векторизованный способ (может быть, использование замаскированных массивов?), Чтобы выяснить, какие строки удалять, но я не смог собрать их вместе. Если у кого-то есть, пожалуйста, прокомментируйте!

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