Numpy операция * = повторяется, несмотря на то, что находится в функции - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы понять, почему я не удаляю массив, несмотря на вызов функции в случае Numpy?

В случае вызова функции mul2 точно, что должно произойтислучается.Но если я попробую точно так же с mul , у меня будет какая-то ссылка на исходный массив.

Как я могу решить проблему?Должен ли я сначала «скопировать» массив, а затем поместить его в функцию?Или я могу сделать копию в функции, а затем удалить ее?Что было бы лучше здесь?

import numpy as np

def mul(h):
  #g = np.zeros([h.shape[0],h.shape[0]])
   g = h
   g[:,0] *= 5
   print(g)

def mul2(h):
  h *= h
  print(h)

a = np.array([[1,2,3,4], [2,3,4,5], [3,4,5,6]])

for i in range(2):
  mul(a)
for i in range(2):
  mul2(5)

Результаты:

[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]

[[25  2  3  4]
[50  3  4  5]
[75  4  5  6]]

25
25

, но из поведения mul2 я ожидаю, что это решение:

[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]
[[ 5  2  3  4]
[10  3  4  5]
[15  4  5  6]]

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Привет, ребята из Интернета, большое спасибо за ваши ответы.Так что, возможно, что-то потеряно во время перевода, но я хотел бы знать, почему mul делает то, что делает, и обработка и рабочий процесс отличаются от mul2 .

.решение:

g = np.copy(h)

Numpy и Python ведут себя по-разному, потому что numpy указывает только на массив.Я думаю, что это одна из причин, почему NumPy так быстро.Как бы то ни было, вы выполняете операцию с массивом, она выполняется в том же месте массива и перезаписывает массив.Как показано выше, это можно обойти с помощью копирования.(Будет создан новый массив.) (Я не думаю, что объяснение является вполне правильным, но я надеюсь, что объяснение легко понять для других.)

0 голосов
/ 19 сентября 2018

Проблема, как правило, в том, как вы звоните mul2().То, что вы делаете, вычисляет следующее:

mul2(5)

Учитывая ваше определение mul2(), эффект строки h *= h заключается в сохранении h * 5 в h, а с hэто 5, то, что вы получите, это h = 5 * 5, и, следовательно, ваш 25 будет напечатан.

Что вы, вероятно, хотите сделать, это что-то вроде:

def mul2(h, n=5):
    h *= n
    print(h)  # not sure you really want this inside your function besides for debugging purposes, and even then...

Это вы бывызовите как:

mul2(h, 5)

, и вы получите что-то похожее на mul(h).

Если вы хотите, чтобы ваш исходный ввод не был изменен, вы можете сделать что-то вроде:

def mul3(h, n=5):
   g = h.copy()
   g *= n
   print(g)  # see above

или даже лучше:

def mul3(h, n=5):
   return h * n

Это создаст копию массива в h с включенной модификацией, которую вы можете print() или делать с любым другим.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...