Как распечатать полный массив NumPy без усечения?

589

Когда я печатаю пустой массив, я получаю усеченное представление, но мне нужен полный массив.

Есть какой-либо способ сделать это?

Примеры:

>>> numpy.arange(10000)
array([   0,    1,    2, ..., 9997, 9998, 9999])

>>> numpy.arange(10000).reshape(250,40)
array([[   0,    1,    2, ...,   37,   38,   39],
       [  40,   41,   42, ...,   77,   78,   79],
       [  80,   81,   82, ...,  117,  118,  119],
       ..., 
       [9880, 9881, 9882, ..., 9917, 9918, 9919],
       [9920, 9921, 9922, ..., 9957, 9958, 9959],
       [9960, 9961, 9962, ..., 9997, 9998, 9999]])
кам
источник
18
Есть ли способ сделать это на разовой основе? То есть распечатать полный вывод один раз, а не в другое время в сценарии?
tumultous_rooster
4
@Matt O'Brien см. Ответ ZSG ниже
user2398029
6
Не могли бы вы поменять принятый ответ на рекомендательный np.inf? np.nanи 'nan'работают только по счастливой случайности, и 'nan'даже не работают в Python 3, потому что они изменили реализацию сравнения смешанного типа, которая threshold='nan'зависела.
user2357112 поддерживает Монику
1
( threshold=np.nanА не 'nan'зависит от другой лапы, которая является то , что логика печати массива сравнивает размер массива к пороговому a.size > _summaryThreshold. Этого всегда возвращается Falseк _summaryThreshold=np.nan. Если сравнению было a.size <= _summaryThreshold, тестирование ли массив должен быть полностью напечатан вместо тестирования должен ли он
Подводя
4
А «одноразовый» способа сделать это: Если у вас есть numpy.array tmpпросто list(tmp). Другие варианты с другим форматированием являются tmp.tolist()или для большего контроля print("\n".join(str(x) for x in tmp)).
travc

Ответы:

629

Используйте numpy.set_printoptions:

import sys
import numpy
numpy.set_printoptions(threshold=sys.maxsize)
Раджа Сельварадж
источник
2
если вы хотите печатать numpyмассив только один раз, к сожалению, у этого решения есть недостаток: вам нужно сбросить это изменение конфигурации после выполнения печати.
Тревор Бойд Смит
1
@TrevorBoydSmith, вы знаете, как сбросить этот параметр после печати?
ColinMac
1
@ColinMac см stackoverflow.com/a/24542498/52074 , где он сохраняет настройки. делает операцию. затем восстанавливает настройки.
Тревор Бойд Смит
1
И как вернуть его в нормальное состояние?
Гульзар
Есть ли способ ввести размер порога вручную?
Амар Кумар
226
import numpy as np
np.set_printoptions(threshold=np.inf)

Я предлагаю использовать np.infвместо того, np.nanчто предлагается другими. Они оба работают для вашей цели, но, установив порог на «бесконечность», для всех, кто читает ваш код, становится очевидным, что вы имеете в виду. Наличие порога «не число» кажется мне немного расплывчатым.

PaulMag
источник
15
Какова обратная операция этого? Как вернуться к предыдущей настройке (с точками)?
Карло
9
@Karlo Номер по умолчанию - 1000, поэтому np.set_printoptions(threshold=1000)он вернется к поведению по умолчанию. Но вы можете установить этот порог как низкий или высокий, как вам нравится. np.set_printoptions(threshold=np.inf)просто изменяет максимальный размер печатного массива до его усечения до бесконечного, так что он никогда не усекается, независимо от его размера. Если вы установите порог для любого действительного числа, то это будет максимальный размер.
PaulMag
8
Это не только яснее, но и гораздо менее хрупко. Там нет никакой обработки специального для np.inf, np.nanили 'nan'. Что бы вы ни указали, NumPy все равно будет использовать обычный >метод для сравнения размера массива с вашим порогом. np.nanпроисходит только на работу , потому что это a.size > _summaryThresholdвместо того a.size <= _summaryThreshold, и np.nanвозвращает Falseдля всех >/ </ >=/ <=сравнений. 'nan'работает только из-за хрупких деталей реализации логики сравнения смешанного типа в Python 2; он полностью ломается на Python 3.
user2357112 поддерживает Monica
2
Использование sys.maxsize , поскольку значение документирована быть ИНТ
mattip
2
Чтобы правильно ответить на вопрос @ Карло, обратите внимание, что начальное значение порога параметров печати находится в np.get_printoptions()['threshold']. Вы можете сохранить это значение до установки порога, а затем восстановить его (или использовать withблок, как предложено в других ответах).
Ниндзяканнон
94

Предыдущие ответы правильные, но в качестве более слабой альтернативы вы можете преобразовать их в список:

>>> numpy.arange(100).reshape(25,4).tolist()

[[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, 25, 26, 27], [28, 29, 30, 31], [32, 33, 34, 35], [36, 37, 38, 39], [40, 41,
42, 43], [44, 45, 46, 47], [48, 49, 50, 51], [52, 53, 54, 55], [56, 57, 58, 59], [60, 61,
62, 63], [64, 65, 66, 67], [68, 69, 70, 71], [72, 73, 74, 75], [76, 77, 78, 79], [80, 81,
82, 83], [84, 85, 86, 87], [88, 89, 90, 91], [92, 93, 94, 95], [96, 97, 98, 99]]
Anoyz
источник
14
Кажется, это лучший разовый способ увидеть весь массив в выражении print.
Аарон Брэмсон
@AaronBramson Я согласен ... это менее подвержено ошибкам, когда вам нужен всего один оператор печати (одна строка кода, а не 3 строки для: изменение конфигурации, печать, сброс конфигурации).
Тревор Бойд Смит
Мне нравится, что это печатает разделители запятых
ObviousChild
58

NumPy 1.15 или новее

Если вы используете NumPy 1.15 (выпущен в 2018-07-23) или новее, вы можете использовать printoptionsменеджер контекста:

with numpy.printoptions(threshold=numpy.inf):
    print(arr)

(конечно, замените numpy, npесли вы импортировали именно так numpy)

Использование диспетчера контекста ( with-block) гарантирует, что после завершения диспетчера контекста параметры печати вернутся к тому, что было до запуска блока. Это обеспечивает временную настройку и применяется только к коду внутри блока.

Смотрите numpy.printoptionsдокументацию для получения подробной информации о менеджере контекста и других аргументах, которые он поддерживает.

Геррит
источник
41

Похоже, вы используете NumPy.

Если это так, вы можете добавить:

import numpy as np
np.set_printoptions(threshold=np.nan)

Это отключит печать на углу. Для получения дополнительной информации см. Этот учебник NumPy .

Рид Копси
источник
4
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Эрик
Да, эта часть официального руководства Numpy неверна
aderchox
37

Вот единственный способ сделать это, который полезен, если вы не хотите изменять настройки по умолчанию:

def fullprint(*args, **kwargs):
  from pprint import pprint
  import numpy
  opt = numpy.get_printoptions()
  numpy.set_printoptions(threshold=numpy.inf)
  pprint(*args, **kwargs)
  numpy.set_printoptions(**opt)
ZSG
источник
13
Похоже, это было бы хорошим местом для использования менеджера контекста, так что вы можете сказать «с полной печатью».
Пол Прайс
8
Не используйте 'nan', np.nanили любой из вышеперечисленных. Это не поддерживается, и этот дурной совет причиняет боль людям, переходящим на python 3
Эрик
1
@ZSG Заменить строку 5 наnumpy.set_printoptions(threshold=numpy.inf)
Нирмал
Спасибо @Nirmal, я отредактировал этот ответ 2014 года, чтобы он работал сегодня.
Поль Ружье
31

Использование менеджера контекста , как Пол Цена sugggested

import numpy as np


class fullprint:
    'context manager for printing full numpy arrays'

    def __init__(self, **kwargs):
        kwargs.setdefault('threshold', np.inf)
        self.opt = kwargs

    def __enter__(self):
        self._opt = np.get_printoptions()
        np.set_printoptions(**self.opt)

    def __exit__(self, type, value, traceback):
        np.set_printoptions(**self._opt)


if __name__ == '__main__': 
    a = np.arange(1001)

    with fullprint():
        print(a)

    print(a)

    with fullprint(threshold=None, edgeitems=10):
        print(a)
neok
источник
7
Этот менеджер контекста встроен в numpy 1.15, благодаря github.com/numpy/numpy/pull/10406 , под именемnp.printoptions
Eric
13

numpy.savetxt

numpy.savetxt(sys.stdout, numpy.arange(10000))

или если вам нужна строка:

import StringIO
sio = StringIO.StringIO()
numpy.savetxt(sio, numpy.arange(10000))
s = sio.getvalue()
print s

Формат вывода по умолчанию:

0.000000000000000000e+00
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
...

и это может быть настроено с дальнейшими аргументами.

Обратите внимание, в частности, как это также не показывает квадратные скобки, и учитывает много настроек, как упомянуто в: Как напечатать массив Numpy без скобок?

Протестировано на Python 2.7.12, numpy 1.11.1.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
источник
1
незначительным недостатком этого метода является то, что он работает только с 1d и 2d массивами
Fnord
@Fnord спасибо за эту информацию, дайте мне знать, если вы найдете обходной путь!
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
10

Это небольшая модификация (удалена возможность передать дополнительные аргументы set_printoptions)в neok S ответа.

Он показывает, как вы можете contextlib.contextmanagerлегко создать такой менеджер контекста с меньшим количеством строк кода:

import numpy as np
from contextlib import contextmanager

@contextmanager
def show_complete_array():
    oldoptions = np.get_printoptions()
    np.set_printoptions(threshold=np.inf)
    try:
        yield
    finally:
        np.set_printoptions(**oldoptions)

В вашем коде это можно использовать так:

a = np.arange(1001)

print(a)      # shows the truncated array

with show_complete_array():
    print(a)  # shows the complete array

print(a)      # shows the truncated array (again)
MSeifert
источник
1
Вы всегда должны помещать try/ finallyвокруг yieldв менеджере контекста, чтобы очистка происходила несмотря ни на что.
Эрик
1
@ Эрик действительно. Спасибо за ваш полезный комментарий, и я обновил ответ.
MSeifert
В 1.15 это можно записатьwith np.printoptions(threshold=np.inf):
Эрик,
6

В дополнение к этому ответу из максимального количества столбцов (фиксируется с помощью numpy.set_printoptions(threshold=numpy.nan)), также есть ограничение на количество отображаемых символов. В некоторых средах, например при вызове python из bash (а не в интерактивном сеансе), это можно исправить, установив параметр linewidthследующим образом.

import numpy as np
np.set_printoptions(linewidth=2000)    # default = 75
Mat = np.arange(20000,20150).reshape(2,75)    # 150 elements (75 columns)
print(Mat)

В этом случае ваше окно должно ограничивать количество символов для переноса строки.

Для тех, кто использует возвышенный текст и хочет видеть результаты в окне вывода, вы должны добавить опцию "word_wrap": falsebuild в файл sublime-build [ source ].

Traxidus Wolf
источник
4

Начиная с версии NumPy 1.16, для более подробной информации смотрите билет GitHub 12251 .

from sys import maxsize
from numpy import set_printoptions

set_printoptions(threshold=maxsize)
Велизар ВЕССЕЛИНОВ
источник
4

Чтобы выключить его и вернуться в обычный режим

np.set_printoptions(threshold=False)
ewalel
источник
Это работает для меня (Jupyter Python версии 3). Вы можете попробовать код ниже. В соответствии с официальной документацией код ниже должен вернуться к настройкам по умолчанию. Что и для меня тоже. > np.set_printoptions (edgeitems = 3, infstr = 'inf', ширина линии = 75, nanstr = 'nan', точность = 8, подавление = False, порог = 1000,
formatter
Хорошо, это должно быть потому, что я не использую Jupyter. Принятый ответ действительно работает для меня в чистой среде Python.
Матю
Это означает threshold=0, что означает «обрезать как можно скорее» - совсем не то, что вы хотите.
Эрик
2

Предположим, у вас есть массив NumPy

 arr = numpy.arange(10000).reshape(250,40)

Если вы хотите напечатать полный массив одноразовым способом (без переключения np.set_printoptions), но хотите что-то более простое (меньше кода), чем менеджер контекста, просто сделайте

for row in arr:
     print row 
Майк Войнович
источник
2

Небольшая модификация: (так как вы собираетесь напечатать огромный список)

import numpy as np
np.set_printoptions(threshold=np.inf, linewidth=200)

x = np.arange(1000)
print(x)

Это увеличит количество символов в строке (по умолчанию ширина линии равна 75). Используйте любое значение для ширины линии, которое подходит для вашей среды программирования. Это избавит вас от необходимости проходить огромное количество строк вывода, добавляя больше символов в каждой строке.

Гаял Куруппу
источник
1

Вы можете использовать array2stringфункцию - документы .

a = numpy.arange(10000).reshape(250,40)
print(numpy.array2string(a, threshold=numpy.nan, max_line_width=numpy.nan))
# [Big output]
Шимон Змильчак
источник
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Эрик
1

Не всегда нужно печатать все элементы, особенно для больших массивов.

Простой способ показать больше предметов:

In [349]: ar
Out[349]: array([1, 1, 1, ..., 0, 0, 0])

In [350]: ar[:100]
Out[350]:
array([1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,
       1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1])

По умолчанию работает нормально, когда нарезанный массив <1000.

Робин Цю
источник
0

Если у вас есть панды в наличии,

    numpy.arange(10000).reshape(250,40)
    print(pandas.DataFrame(a).to_string(header=False, index=False))

Избегает побочного эффекта, требующего сброса, numpy.set_printoptions(threshold=sys.maxsize)и вы не получите numpy.array и скобки. Я считаю это удобным для сброса широкого массива в файл журнала

Бен
источник
-1

Если массив слишком велик для печати, NumPy автоматически пропускает центральную часть массива и печатает только углы. Чтобы отключить это поведение и заставить NumPy печатать весь массив, вы можете изменить параметры печати, используя set_printoptions.

>>> np.set_printoptions(threshold='nan')

или

>>> np.set_printoptions(edgeitems=3,infstr='inf',
... linewidth=75, nanstr='nan', precision=8,
... suppress=False, threshold=1000, formatter=None)

Вы также можете обратиться к справочной документации для «или части» для получения дополнительной помощи.

Аршдип Сингх
источник
3
Не используйте 'nan', np.nanили любой из вышеперечисленных. Это не поддерживается, и этот дурной совет причиняет боль людям, переходящим на python 3
Эрик
ValueError: threshold must be numeric and non-NAN, try sys.maxsize for untruncated representation
Эрик