Ответ 1
Я думаю, что это в реализации np.sum(). Например:
import numpy as np
A = np.random.standard_normal((10000,10000))
C = np.array(A, order='C')
F = np.array(A, order='F')
Бенчмаркинг с Ipython:
In [7]: %timeit C.sum(axis=0)
10 loops, best of 3: 101 ms per loop
In [8]: %timeit C.sum(axis=1)
10 loops, best of 3: 149 ms per loop
In [9]: %timeit F.sum(axis=0)
10 loops, best of 3: 149 ms per loop
In [10]: %timeit F.sum(axis=1)
10 loops, best of 3: 102 ms per loop
Таким образом, он ведет себя точно так же, как и ожидалось. Но попробуйте другую функцию:
In [17]: %timeit np.amax(C, axis=0)
1 loop, best of 3: 173 ms per loop
In [18]: %timeit np.amax(C, axis=1)
10 loops, best of 3: 70.4 ms per loop
In [13]: %timeit np.amax(F,axis=0)
10 loops, best of 3: 72 ms per loop
In [14]: %timeit np.amax(F,axis=1)
10 loops, best of 3: 168 ms per loop
Конечно, это яблоки для апельсинов. Но np.amax() работает вдоль оси, как и сумма и возвращает вектор с одним элементом для каждой строки/столбца. И ведет себя так, как можно было бы ожидать.
In [25]: C.strides
Out[25]: (80000, 8)
In [26]: F.strides
Out[26]: (8, 80000)
Сообщает нам, что массивы фактически упакованы в порядок строк, а порядок столбцов и цикл в этом направлении должны быть намного быстрее. Если, например, сумма не суммирует каждую строку за строкой, поскольку она перемещается вдоль столбцов для обеспечения суммы столбца (ось = 0). Но без середины подглядывания внутри .pyd я просто размышляю.
EDIT:
От ссылки percusse: http://docs.scipy.org/doc/numpy/reference/generated/numpy.ufunc.reduce.html
Уменьшает размерность единицы, применяя ufunc вдоль одной оси.
Пусть a.shape = (N_0,..., N_i,..., N_ {M-1}). Затем ufunc.reduce(a, axis = i) [k_0,.., k_ {i-1}, k_ {i + 1},.., k_ {M-1}] = результат итерации j по диапазону ( N_i), кумулятивно применяя ufunc к каждому a [k_0,.., k_ {i-1}, j, k_ {i + 1},.., k_ {M-1}]
Итак, в псевдокоде при вызове F.sum(axis = 0):
for j=cols #axis=0
for i=rows #axis=1
sum(j,i)=F(j,i)+sum(j-1,i)
Таким образом, на самом деле он будет перебирать строку при вычислении суммы столбца, значительно замедляя ее, когда он находится в основном столбце. Такое поведение объясняет разницу.
eric link предоставляет нам реализацию, для кого-то достаточно любопытного, чтобы пройти через большое количество кода по этой причине.