Как заменить одну строку в массиве NumPy - PullRequest
1 голос
/ 08 ноября 2019

Я хочу заменить строку массива NumPy той же строкой после изменения функцией.

Вот мой код:

def _softmax(z):
   array = np.exp(z)
   array = np.divide(array,np.sum(array))
   return array

a = np.array([[1,2,3,4],[5,15,4,7]])
n =_softmax(a[0])
print(n)

a[0]= n
print(a[0])

Я получаю следующий результат:

[0.0320586  0.08714432 0.23688282 0.64391426]
[0 0 0 0]

Как видите, n это нормально, но a[0]не изменится, кроме как [0,0,0,0]. Однако, если я попытаюсь:

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

... это прекрасно работает.

1 Ответ

0 голосов
/ 08 ноября 2019

Причина в том, что a изначально имеет тип np.int64, тогда как вывод вашего softmax равен np.float. Вы должны изменить точность массива NumPy a на np.float, иначе присвоение в первую строку a преобразуется с понижением до целочисленной точности:

a = np.array([[1,2,3,4],[5,15,4,7]], dtype=np.float)

Причина, по которой он созданс типом np.int64 изначально, потому что все ваши значения являются целыми числами. Как только вы меняете один из них на плавающий, массив переводится в плавающую точку:

In [9]: a = np.array([[1,2,3,4],[5,15,4,7]])

In [10]: a.dtype
Out[10]: dtype('int64')

In [11]: a = np.array([[1.0,2,3,4],[5,15,4,7]])

In [12]: a.dtype
Out[12]: dtype('float64')

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

Наконец, как только мы выполним все, что получим:

In [14]: a
Out[14]:
array([[ 0.0320586 ,  0.08714432,  0.23688282,  0.64391426],
       [ 5.        , 15.        ,  4.        ,  7.        ]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...