Похоже, вы хотите удалить строку вашего массива на месте , однако это невозможно с использованием функции 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
.
Я уверен, что есть лучший векторизованный способ (может быть, использование замаскированных массивов?), Чтобы выяснить, какие строки удалять, но я не смог собрать их вместе. Если у кого-то есть, пожалуйста, прокомментируйте!