Множественный инкремент выбора индекса в numpy [duplicate]

Есть ли у кого-нибудь какие-либо другие причины, по которым я продолжаю получать ошибку?

blockquote>

Текущие версии Apache Spark не поддерживают Java 9 или новее. Поддержка этих (или более поздних версий) запланирована для выпуска 3.0.

Пока что для запуска Spark вам придется использовать JDK 8.

Источник: время для Apache Spark 3.0?

4
задан Divakar 20 November 2015 в 21:37
поделиться

2 ответа

Мы можем использовать np.bincount , который предположительно довольно эффективен для такого накопительного взвешенного подсчета, так что вот один из них -

counts = np.bincount(i,v)
d[:counts.size] = counts

Альтернативно, используя вход minlength аргумент и для общего случая, когда d может быть любым массивом, и мы хотим добавить в него -

d += np.bincount(i,v,minlength=d.size).astype(d.dtype, copy=False)

Тесты времени выполнения

В этом разделе сравнивается подход на основе np.add.at в other post с np.bincount, описанным ранее в этом сообщении.

In [61]: def bincount_based(d,i,v):
    ...:     counts = np.bincount(i,v)
    ...:     d[:counts.size] = counts
    ...: 
    ...: def add_at_based(d,i,v):
    ...:     np.add.at(d, i, v)
    ...:     

In [62]: # Inputs (random numbers)
    ...: N = 10000
    ...: i = np.random.randint(0,1000,(N))
    ...: v = np.random.randint(0,1000,(N))
    ...: 
    ...: # Setup output arrays for two approaches
    ...: M = 12000
    ...: d1 = np.zeros(M)
    ...: d2 = np.zeros(M)
    ...: 

In [63]: bincount_based(d1,i,v) # Run approaches
    ...: add_at_based(d2,i,v)
    ...: 

In [64]: np.allclose(d1,d2)  # Verify outputs
Out[64]: True

In [67]: # Setup output arrays for two approaches again for timing
    ...: M = 12000
    ...: d1 = np.zeros(M)
    ...: d2 = np.zeros(M)
    ...: 

In [68]: %timeit add_at_based(d2,i,v)
1000 loops, best of 3: 1.83 ms per loop

In [69]: %timeit bincount_based(d1,i,v)
10000 loops, best of 3: 52.7 µs per loop
4
ответ дан Divakar 25 August 2018 в 18:41
поделиться
np.add.at(d, i, v)

Вы думаете, что d[i] += v будет работать, но если вы попытаетесь сделать несколько дополнений к одной и той же ячейке таким образом, один из них переопределяет остальные. Метод ufunc.at позволяет избежать этих проблем.

5
ответ дан user2357112 25 August 2018 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: