Как исключить строки / столбцы из numpy.сведения ndarray

предположим, что у нас есть numpy.данные ndarray, скажем, с формой (100,200), и у вас также есть список индексов, которые вы хотите исключить из данных. Как ты это сделаешь? Что-то вроде этого:--2-->

a = numpy.random.rand(100,200)
indices = numpy.random.randint(100,size=20)
b = a[-indices,:] # imaginary code, what to replace here?

спасибо.

4 ответов


можно использовать b = numpy.delete(a, indices, axis=0)

источник: включает в себя документы.


это уродливо, но работает:

b = np.array([a[i] for i in range(m.shape[0]) if i not in indices])

вы можете попробовать:

a = numpy.random.rand(100,200)
indices = numpy.random.randint(100,size=20)
b = a[np.setdiff1d(np.arange(100),indices),:]

это позволяет избежать создания mask массив того же размера, что и ваши данные в https://stackoverflow.com/a/21022753/865169. Обратите внимание, что в этом примере создается 2D-массив b вместо сплющенного массива в последнем ответе.

сырой расследование против выполнения затрат памяти этого подхода против https://stackoverflow.com/a/30273446/865169 к delete быстрее, в то время как индексации с setdiff1d гораздо проще на потребление памяти:

In [75]: %timeit b = np.delete(a, indices, axis=0)
The slowest run took 7.47 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 24.7 µs per loop

In [76]: %timeit c = a[np.setdiff1d(np.arange(100),indices),:]
10000 loops, best of 3: 48.4 µs per loop

In [77]: %memit b = np.delete(a, indices, axis=0)
peak memory: 52.27 MiB, increment: 0.85 MiB

In [78]: %memit c = a[np.setdiff1d(np.arange(100),indices),:]
peak memory: 52.39 MiB, increment: 0.12 MiB

вы можете попробовать что-то вроде этого:

a = numpy.random.rand(100,200)
indices = numpy.random.randint(100,size=20)
mask = numpy.ones(a.shape, dtype=bool)
mask[indices,:] = False
b = a[mask]