UPDATE: Действительно умные люди быстро указали на этот ответ , который объясняет странность, описанную ниже
ОРИГИНАЛЬНЫЙ ОТВЕТ:
я знаю, помогает ли это кому-либо, но я был застрял с той же проблемой, даже когда делал что-то вроде правды. В моем основном методе у меня есть такой код:
ApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {
"common.xml",
"token.xml",
"pep-config.xml" });
TokenInitializer ti = context.getBean(TokenInitializer.class);
и в файле token.xml
у меня была строка
Я заметил, что пакет .path больше не существует, поэтому я просто положил строку навсегда.
И после этого NPE начал заходить. В pep-config.xml
у меня было всего 2 боба:
и класс SomeAbac имеет свойство, объявленное как
@Autowired private Settings settings;
по неизвестной причине, настройки null в init (), когда элемент
отсутствует вообще, но когда он присутствует и имеет некоторые bs в качестве basePackage, все работает Что ж. Теперь эта строка выглядит так:
, и она работает. Может быть, кто-то может дать объяснение, но для меня это достаточно прямо сейчас)
эквивалент NumPy itertools.product()
равен numpy.indices()
, но он только даст вам произведение диапазонов формы 0, ..., k-1:
numpy.rollaxis(numpy.indices((2, 3, 3)), 0, 4)
array([[[[0, 0, 0],
[0, 0, 1],
[0, 0, 2]],
[[0, 1, 0],
[0, 1, 1],
[0, 1, 2]],
[[0, 2, 0],
[0, 2, 1],
[0, 2, 2]]],
[[[1, 0, 0],
[1, 0, 1],
[1, 0, 2]],
[[1, 1, 0],
[1, 1, 1],
[1, 1, 2]],
[[1, 2, 0],
[1, 2, 1],
[1, 2, 2]]]])
. Для вашего в специальном случае вы можете использовать
a = numpy.indices((4,)*13)
b = 1j ** numpy.rollaxis(a, 0, 14)
(это не будет работать в 32-битной системе, потому что массив будет большим. Экстраполируя размер, который я могу проверить, он должен работать меньше, чем хотя.)
EIDT: просто упомянуть об этом: вызов numpy.rollaxis()
более или менее косметический, чтобы получить тот же результат, что и itertools.product()
. Если вы не заботитесь о порядке индексов, вы можете просто опустить его (но он все равно дешев, если у вас нет никаких последующих действий, которые преобразуют ваш массив в смежный массив.)
EDIT2: Чтобы получить точный аналог
numpy.array(list(itertools.product(some_list, repeat=some_length)))
, вы можете использовать
numpy.array(some_list)[numpy.rollaxis(
numpy.indices((len(some_list),) * some_length), 0, some_length + 1)
.reshape(-1, some_length)]
. Это стало совершенно нечитаемым - просто скажите, нужно ли мне это объяснять далее:)
length = 13
x = [1, -1, 1j, -1j]
mesh = numpy.meshgrid(*([x] * length))
result = numpy.vstack([y.flat for y in mesh]).T
на моем ноутбуке требуется ~ 2 минуты
Первая строка кажется мгновенной, поскольку фактическая операция не выполняется. Объект-генератор только что сконструирован и только тогда, когда вы выполняете его через операцию. Как вы сказали, вы получаете номера 4^13 = 67108864
, все они вычисляются и становятся доступными во время вашего вызова list
. Я вижу, что np.array принимает только список или кортеж, поэтому вы можете попробовать создать кортеж из своего итератора и передать его np.array, чтобы увидеть, есть ли разница в производительности, и это не влияет на общую производительность вашей программы , Это можно определить, только пытаясь использовать ваш файл, хотя есть некоторые точки , которые говорят, что кортеж немного быстрее.
Чтобы попробовать с кортежем, вместо списка просто сделайте
sendbuf = np.array(tuple(c))
Возможно, вы захотите попробовать совершенно другой подход: сначала создайте пустой массив желаемого размера:
result = np.empty((4**length, length), dtype=complex)
, затем используйте способности NumPy для нарезки, чтобы заполнить массив самостоятельно:
# Set up of the last "digit":
result[::4, length-1] = 1
result[1::4, length-1] = -1
result[2::4, length-1] = 1j
result[3::4, length-1] = -1j
Вы можете делать подобные вещи для других «цифр» (т. е. элементов результата [:, 2], результата [:, 1] и результата [:, 0]). Все это, безусловно, можно было бы ввести в цикл, который итерации по каждой цифре.
Перенос всей операции (np.empty((length, 4**length)…)
) стоит попробовать, так как это может привести к увеличению скорости (благодаря лучшему использованию кеш памяти).
fromiter()
пытается создать массив 1D i> tuples i> (эта функция создает только 1D-массивы). Таким образом, хороший выбор типа был бы dtype=object
... но NumPy отказывается это делать. Я не уверен, как решить эту проблему (кроме лоббирования за возможность использования dtype=object
:).
– Eric Lebigot
17 January 2011 в 16:19
result[:, length-1]
должно быть установлено значение [1, 1, 1, 1, -1, -1, -1, -1, 1j, 1j, и т.д.]. И аналогично для последующих цифр (с повторяющимися последовательностями увеличивающегося размера). Яснее? :)
– Eric Lebigot
17 January 2011 в 18:25
numpy.indices()
; разница в том, что я устанавливал координаты вручную, но прямо к значениям, запрошенным в вопросе.
– Eric Lebigot
21 January 2011 в 10:48
Вероятно, не оптимизирован, но гораздо меньше зависит от преобразований типа python:
ints = [1,2,3,4]
repeat = 3
def prod(ints, repeat):
w = repeat
l = len(ints)
h = l**repeat
ints = np.array(ints)
A = np.empty((h,w), dtype=int)
rng = np.arange(h)
for i in range(w):
x = l**i
idx = np.mod(rng,l*x)/x
A[:,i] = ints[idx]
return A
rollaxis()
илиreshape()
, а использовать выходindices()
как есть. Например, вы можете перебирать все перестановки с помощьюfor perm in izip(*(a.ravel() for a in numpy.indices(...)))
. Скорее всего, вы также можете обойтись без изменения вашего приложения. – Sven Marnach 17 January 2011 в 17:42a = numpy.indices((4,)*4)
, тоa[0]
будет содержать все значения для первого «индекса»,a[1]
будут значениями для второго «индекса» и т. Д. Для каждогоn
в диапазоне от 0 до 4 ^ 4-1a[0].flat[n], a[1].flat[n], a[2].flat[n], a[3].flat[n]
будет допустимой перестановкой без дубликатов. Если вас смущает упорядочение результатов, просто используйтеrollaxis()
, но вам этого не нужно. – Sven Marnach 17 January 2011 в 18:01