Numpy выходная функция увеличивается с каждым прогоном - PullRequest
1 голос
/ 21 февраля 2020

Минимальный рабочий пример:

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) для меня.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Хотите увидеть что-то еще веселее? Если вы измените определение sumcols на:

def sumcols(data):
    temp = np.empty(data.shape[0])
    temp2 = np.empty(data.shape[0])
    for i in range(data.shape[0]):
        for j in range(data.shape[1]):
            temp2[i] += data[i,j]
    return temp2

после того, как вы уже несколько раз запустили исходное определение, вы заметите, что эта функция будет продолжать увеличивать те же значения, что и старая версия left off.

Кажется, что numpy имеет заданную область c в памяти, которую он всегда любит начинать при выделении памяти для новых переменных. Если вы продолжаете вызывать np.empty для массива того же размера, вы будете получать тот же блок памяти и, следовательно, те же значения, поскольку вы не инициализируете его в первую очередь.

0 голосов
/ 21 февраля 2020

Похоже, что вы могли бы решить эту проблему более простым способом, просто получив доступ к каждому столбцу в каждой строке, тогда вам не придется иметь дело с проблемами библиотеки:

def sumCols(list):
    sums = []
    for i in list:
        sum = 0
        for j in i:
            sum += j
        sums.append(sum)
    return(sums)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...