Я пытаюсь понять, как работать с nditer, чтобы сделать в моем случае преобразование 3d-массива в массив 2d.
Я следил за помощью здесь http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html и удалось создать функцию, которая применяет уменьшение по последней оси ввода. С помощью этой функции
def nditer_sum(data, red_axes):
it = numpy.nditer([data, None],
flags=['reduce_ok', 'external_loop'],
op_flags=[['readonly'], ['readwrite', 'allocate']],
op_axes=[None, red_axes])
it.operands[1][...] = 0
for x, y in it:
y[...] = x.sum()
return it.operands[1]
Я могу получить что-то эквивалентное data.sum(axis = 2)
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> nditer_sum(data, [0, 1, -1])
[[ 6 22 38]
[54 70 86]]
>>> data.sum(axis=2)
[[ 6 22 38]
[54 70 86]]
Итак, чтобы получить что-то эквивалентное data.sum(axis = 0) Я хотя это было достаточно, чтобы изменить аргумент red_axes на [-1, 0,1] Но результат совсем другой.
>>> data = numpy.arange(2*3*4).reshape((2,3,4))
>>> data.sum(axis=0)
[[12 14 16 18]
[20 22 24 26]
[28 30 32 34]]
>>> nditer_sum(data, [-1, 0, 1])
[[210 210 210 210]
[210 210 210 210]
[210 210 210 210]]
В цикле for внутри nditer_sum (для x, y в нем:) итератор петля 2 раза и давая массив длиной 12 каждый раз, вместо цикл 12 раз и давая массив длины 2 каждый раз. у меня есть несколько раз прочитайте документацию по количеству писем и перейдите по этой ссылке в нет. Я использую numpy 1.6 и python 2.7