Функция numpy .apply_along_axis неожиданный результат - PullRequest
2 голосов
/ 28 мая 2020

Я хочу закодировать функцию для преобразования массива 2D numpy в матричный синтаксис Mathematica. Однако я обнаружил неожиданное поведение функции numpy .apply_along_axis .

Это фрагмент кода, показывающий это странное поведение

import numpy as np
A=np.array([[-5,6,-7,6,0],[-5,-3,-9,-1,0],[1,-4,0,-4,-4],[4,0,-3,-4,3]])
func=lambda x: '{' + ','.join(x) + '}'
A=A.astype(str)
print(np.apply_along_axis(func,1,A))
print([func(row) for row in A])

Вывод :

['{-5,6,-7,6,0}' '{-5,-3,-9,-1,' '{1,-4,0,-4,-4' '{4,0,-3,-4,3}']
['{-5,6,-7,6,0}', '{-5,-3,-9,-1,0}', '{1,-4,0,-4,-4}', '{4,0,-3,-4,3}']

Похоже, что функция func неправильно применяется к строкам 1 и 2 массива A.

Python version: 3.6.9
OS: Ubuntu Linux 18.04.4 LTS
Numpy version: 1.13.3

1 Ответ

1 голос
/ 28 мая 2020

Похоже, это связано с типом выходного массива (который является строкой). После преобразования вашего первого вывода в строку numpy, похоже, определяет свой тип на основе длины первой строки: <U13. Все последующие выходные данные обрезаются до этой длины. Проверьте это следующим образом:

In [20]: b = np.apply_along_axis(func,1,A)
In [21]: b
Out[21]:
array(['{-5,6,-7,6,0}', '{-5,-3,-9,-1,', '{1,-4,0,-4,-4', '{4,0,-3,-4,3}'],
      dtype='<U13')

Как вы уже указали в вопросе, есть способы решить эту проблему без использования np.apply_along_axis. Например, продолжая свой подход, вы можете сказать:

output = [func(x) for x in A]

Операция in возвращает по одной строке за раз для массива 2D numpy, поэтому вы получите список строк:

['{-5,6,-7,6,0}', '{-5,-3,-9,-1,0}', '{1,-4,0,-4,-4}', '{4,0,-3,-4,3}']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...