Есть ли у кого-нибудь какие-либо другие причины, по которым я продолжаю получать ошибку?
blockquote>Текущие версии Apache Spark не поддерживают Java 9 или новее. Поддержка этих (или более поздних версий) запланирована для выпуска 3.0.
Пока что для запуска Spark вам придется использовать JDK 8.
Источник: время для Apache Spark 3.0?
Мы можем использовать 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
np.add.at(d, i, v)
Вы думаете, что d[i] += v
будет работать, но если вы попытаетесь сделать несколько дополнений к одной и той же ячейке таким образом, один из них переопределяет остальные. Метод ufunc.at
позволяет избежать этих проблем.