Минимальный рабочий пример:
import numpy as np
datatest = np.array([[1, 2, 3], [1, 1, 2], [3, 3, 3]])
def sumcols(data):
temp = np.empty(data.shape[0])
for i in range(data.shape[0]):
for j in range(data.shape[1]):
temp[i] += data[i,j]
return temp
sumcols(datatest)
datatest
- это следующий массив:
array([[1, 2, 3],
[1, 1, 2],
[3, 3, 3]])
Я просто пытаюсь суммировать значения в столбцах (и или ряды).
Странная часть. Когда я запускаю эту функцию (ie. sumcols(datatest)
) несколько раз, каждый результат больше, чем следующий. Это значение поведения сохраняется с разными именами функций :
n [4]: def means(data):
...: temp = np.empty(data.shape[0])
...: for i in range(data.shape[0]):
...: for j in range(data.shape[1]):
...: temp[i] += data[i,j]
...: return temp
...:
In [5]: means(datatest)
Out[5]: array([6., 4., 9.])
In [6]: means(datatest)
Out[6]: array([12., 8., 18.])
In [7]: means(datatest)
Out[7]: array([18., 12., 27.])
In [8]: means(datatest)
Out[8]: array([24., 16., 36.])
In [9]: means(datatest)
Out[9]: array([30., 20., 45.])
In [10]: def sumcols(data):
...: temp = np.empty(data.shape[0])
...: for i in range(data.shape[0]):
...: for j in range(data.shape[1]):
...: temp[i] += data[i,j]
...: return temp
...:
In [11]: sumcols(datatest)
Out[11]: array([36., 24., 54.])
In [12]: sumcols(datatest)
Out[12]: array([42., 28., 63.])
In [13]: sumcols(datatest)
Out[13]: array([48., 32., 72.])
In [14]: sumcols(datatest)
Out[14]: array([54., 36., 81.])
In [15]: sumcols(datatest)
Out[15]: array([60., 40., 90.])
In [16]: sumcols(datatest)
Out[16]: array([66., 44., 99.])
In [17]: sumcols(datatest)
Out[17]: array([ 72., 48., 108.])
Как это происходит? Я не назначаю переменную внутри или снаружи функции и переменная temp
сбрасывается при каждом вызове функции.
Редактировать:
Проблема, похоже, связана переменная temp
объявляется пустой. Если я изменю temp = np.empty(data.shape[0])
на temp = np.zeros(data.shape[0])
, он будет работать правильно. Я работаю над отправкой проблемы в numpy разработчиков, чтобы проверить, является ли это желаемым поведением.
Редактировать 2: Кто-то уже написал проблему . Как и ожидалось, это желаемое поведение, которое не будет изменено.
tl; dr
Инициализируйте с np.empty
, только если вы явно отправите результаты. В противном случае используйте другую инициализацию для вашего конкретного c случая (np.zeros
) для меня.