Я недавно заметил, что функции печати Python не совместимы с NumPy ndarays. Например, он печатает горизонтальный массив 1D по горизонтали:
import numpy as np
A1=np.array([1,2,3])
print(A1)
#--> [1 2 3]
, но 1D горизонтальный массив с избыточными вертикальными скобками:
A2=np.array([[1],[2],[3]])
print(A2)
#--> [[1]
# [2]
# [3]]
1D вертикальный массив по горизонтали:
A3=np.array([[1,2,3]])
print(A3)
#--> [[1 2 3]]
и двумерный массив:
B=np.array([[11,12,13],[21,22,23],[31,32,32]])
print(B)
# --> [[11 12 13]
# [21 22 23]
# [31 32 32]]
где первое измерение теперь вертикальное. Для более высоких измерений становится еще хуже, поскольку все они печатаются вертикально:
C=np.array([[[111,112],[121,122]],[[211,212],[221,222]]])
print(C)
#--> [[[111 112]
# [121 122]]
#
# [[211 212]
# [221 222]]]
По моему мнению, последовательное поведение состоит в том, чтобы печатать четные размеры по горизонтали и нечетные по вертикали. Используя символы Юникода, можно было бы красиво отформатировать его. Мне было интересно, если можно создать функцию для печати над массивами как:
A1 --> [1 2 3]
A2 --> ┌┌─┐┌─┐┌─┐┐
│ 1 2 3 │
└└─┘└─┘└─┘┘
A3 --> ┌┌─┐┐ # \u250c\u2500\u2510
│ 1 │ # \u2502
│ 2 │
│ 3 │
└└─┘┘ # \u2514\u2500\u2518
B --> ┌┌──┐┌──┐┌──┐┐
│ 11 21 31 │
│ 12 22 32 │
│ 13 23 33 │
└└──┘└──┘└──┘┘
C --> ┌┌─────────┐┌─────────┐┐
│ [111 112] [211 212] │
│ [121 122] [221 222] │
└└─────────┘└─────────┘┘
Я нашел этот gist , который заботится о различном количестве цифр. Я попытался создать прототип рекурсивной функции для реализации вышеуказанной концепции:
def npprint(A):
assert isinstance(A, np.ndarray), "input of npprint must be array like"
if A.ndim==1 :
print(A)
else:
for i in range(A.shape[1]):
npprint(A[:,i])
Это вроде работает для A1
, A2
, A3
и B
, но не для C
. Буду признателен, если вы поможете мне узнать, как должно быть npprint
для достижения указанного выше результата для numpy ndarrays произвольного измерения?
P.S.1. В среде Jupyter можно использовать LaTeX \mathtools
\underbracket
и \overbracket
в Markdown. Симпатичная функциональность печати Sympy также является отличной отправной точкой. Может использовать ASCII, Unicode, LaTeX ...
P.S.2. Мне говорят, что действительно существует последовательность в способе печати ndarrays. однако ИМХО это отчасти проводной и не интуитивно понятный. Наличие гибкой симпатичной функции печати может очень помочь для отображения ndarrays в различных формах.
P.S.3. Симпатичные парни уже рассмотрели оба момента, которые я упомянул здесь. их матричный модуль довольно согласован (A1
и A2
одинаковы), и у них также есть функция pprint
, которая делает то же самое, и я ожидаю от npprint здесь.
P.S.4. Для тех, кто придерживается этой идеи, я включил все это в в эту записную книжку Jupyter