Строковое представление массива numpy с запятыми, разделяющими его элементы

У меня есть массив numpy, например:

points = np.array([[-468.927,  -11.299,   76.271, -536.723],
                   [-429.379, -694.915, -214.689,  745.763],
                   [   0.,       0.,       0.,       0.   ]])

если я печатаю его или превращаю в строку с помощью str(), я получаю:

print w_points
[[-468.927  -11.299   76.271 -536.723]
 [-429.379 -694.915 -214.689  745.763]
 [   0.       0.       0.       0.   ]]

Мне нужно превратить его в строку, которая печатает с разделительными запятыми, сохраняя структуру 2D-массива, а именно:

[[-468.927,  -11.299,   76.271, -536.723],
 [-429.379, -694.915, -214.689,  745.763],
 [   0.,       0.,       0.,       0.   ]]

Кто-нибудь знает простой способ превратить массив numpy в эту форму строки?

Я знаю, что .tolist() добавляет запятые, но результат теряет двумерную структуру.

Ответы

Ответ 1

Попробуйте использовать repr

>>> import numpy as np
>>> points = np.array([[-468.927,  -11.299,   76.271, -536.723],
...                    [-429.379, -694.915, -214.689,  745.763],
...                    [   0.,       0.,       0.,       0.   ]])
>>> print repr(points)
array([[-468.927,  -11.299,   76.271, -536.723],
       [-429.379, -694.915, -214.689,  745.763],
       [   0.   ,    0.   ,    0.   ,    0.   ]])

Если вы планируете использовать большие массивы numpy, сначала установите np.set_printoptions(threshold=np.nan). Без него представление массива будет усечено после примерно 1000 записей (по умолчанию).

>>> arr = np.arange(1001)
>>> print repr(arr)
array([   0,    1,    2, ...,  998,  999, 1000])

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

Ответ 2

Теперь, в numpy 1.11, есть numpy.array2string:

In [279]: a = np.reshape(np.arange(25, dtype='int8'), (5, 5))

In [280]: print(np.array2string(a, separator=', '))
[[ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24]]

Сравнение с repr с @mgilson (показывает "array()" и dtype):

In [281]: print(repr(a))
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]], dtype=int8)

P.S. Еще нужно np.set_printoptions(threshold=np.nan) для большого массива.

Ответ 3

Другой способ сделать это, что особенно полезно, когда объект не имеет метода __repr __(), заключается в использовании модуля Python pprint (который имеет различные параметры форматирования). Вот что выглядит, например:

>>> import numpy as np
>>> import pprint
>>>
>>> A = np.zeros(10, dtype=np.int64)
>>>
>>> print(A)
[0 0 0 0 0 0 0 0 0 0]
>>>
>>> pprint.pprint(A)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])