Np.sum разные для оси - PullRequest
       0

Np.sum разные для оси

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

Я сталкиваюсь со странным / интересным поведением.

У меня есть массив формы (64,25)

И для суммы одного элемента этого массива (называемого 'img') мы получаем:

print(np.sum(img[::1,[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24]][14]))
#106.15421 get printed out

и для того же элемента np.sum (img, axis = 1) получаем что-то другое:

k = np.sum(img[::1,[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24]],1)
print(k[14])
#106.15422 get printed out

Как это возможно, и Есть что-нибудь, что я могу сделать?

Ps Я проверяю другой способ изучить это поведение:

print(np.sum(np.delete(img,np.s_[12],1)[14]))
k_d = np.sum(np.delete(img,np.s_[12],1),1)
print(k_d[14])
# Here both times we get 106.15421

1 Ответ

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

Я проверил себя и смог восстановить ваше поведение, используя тип float32 для img:

img=np.random.random((64,25)).astype(np.float32)
select=[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24]
Isel=img[:,select]
h=np.sum(Isel[14,...])
print(h)
k = np.sum(Isel,axis=1)
print(k[14],h-k[14])
ks = sum(img[14,select])
print(ks,h-ks)

10.111376

10.111374 1.9073486e-06

10.11137617379427 -3.650784492492676e-07

Это происходит не всегда. Кажется, это числовая ошибка. Если вы используете float64, он падает до e-16. Я предполагаю, что порядок или способ сложения другой, что вызывает другое округление.

btw: общая сумма c изменилась на float64 сама по себе, поэтому она распечатывается с большей точностью .

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