Як надрукувати повний масив NumPy без укорочення?


587

Коли я друкую нумерований масив, я отримую усічене представлення, але хочу повний масив.

Чи можна це зробити?

Приклади:

>>> 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

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, тестування чи масив повинен бути повністю надрукований замість тестування повинен він резюмувати, цей поріг викличе підсумовування всіх масивів).
user2357112 підтримує Моніка

4
А «одноразовий» способу зробити це: Якщо у вас є numpy.array tmpпросто list(tmp). Інші параметри з різним форматуванням є tmp.tolist()або для більшого контролю print("\n".join(str(x) for x in tmp)).
travc

Відповіді:


627

Використання 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що пропонують інші. Вони обидва працюють для вашої мети, але встановивши поріг на "нескінченність", всім, хто читає ваш код, очевидно, що ви маєте на увазі. Маючи поріг "не число" мені здається трохи невиразним.


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 підтримує Моніку

2
Використовуйте sys.maxsize, оскільки значення документально зафіксовано як int
mattip

2
Щоб правильно відповісти на питання Карла, зауважте, що початкове значення для порогу параметрів друку знайдено в np.get_printoptions()['threshold']. Ви можете зберегти це значення перед встановленням порогу, а потім відновити його після цього (або використовувати withблок, як пропонується в інших відповідях).
Ninjakannon

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]]

14
Здається, це найкращий одноразовий спосіб побачити повний масив у виписці з друку.
Аарон Брамсон

@AaronBramson я згоден ... це менше схильність до помилок, коли вам потрібно лише одне твердження про друк (один рядок коду на відміну від 3 рядків для: зміни конфігурації, друку, скидання конфігурації).
Тревор Бойд Сміт

Мені подобається, що це друкує роздільники комах
ObviousChild

57

NumPy 1.15 або новішої версії

Якщо ви використовуєте NumPy 1.15 (випущений 2018-07-23) або новішу, ви можете скористатися printoptionsменеджером контексту:

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

(звичайно, замініть numpy, npякщо так ви імпортували numpy)

Використання менеджера контексту ( with-блок) гарантує, що після закінчення менеджера контексту параметри друку повернуться до того, що вони були до початку блоку. Це гарантує, що налаштування є тимчасовим і застосовується лише до коду всередині блоку.

Дивіться numpy.printoptionsдокументацію для отримання докладної інформації про менеджера контексту і які інші аргументи , які він підтримує.


41

Це здається, що ви використовуєте нуме.

Якщо це так, ви можете додати:

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
Ерік

Так, та частина офіційного навчального посібника з Нюмпі неправильна
aderchox

36

Ось одноразовий спосіб зробити це, що корисно, якщо ви не хочете змінювати налаштування за замовчуванням:

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)

13
Схоже, це було б хорошим місцем для використання контекстного менеджера, тому ви можете сказати "з повним друком".
Пол Ціна

8
Не використовуйте 'nan', np.nanабо будь-яке з перерахованого вище. Це не підтримується, і ця погана порада заподіює біль людям, які переходять на пітон 3
Ерік

1
@ZSG Замініть рядок 5 наnumpy.set_printoptions(threshold=numpy.inf)
Nirmal

Дякую @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)

7
Цей контекстний менеджер вбудований у numpy 1.15, завдяки github.com/numpy/numpy/pull/10406 , під назвоюnp.printoptions
Ерік

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.


1
Незначним недоліком цього методу є те, що працює лише з масивами 1d та 2d
Fnord

@Fnord дякую за цю інформацію, повідомте мені, якщо ви знайдете вирішення!
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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)

1
Ви завжди повинні ставити a try/ finallyaround в yieldу контекстний менеджер, щоб очищення відбувалося незалежно від того.
Ерік

1
@Eric дійсно. Дякую за корисний коментар, і я оновив відповідь.
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": falseдо файлу збірки піднесеного [[ джерело ].



4

Щоб вимкнути його та повернутись у звичайний режим

np.set_printoptions(threshold=False)

Це працює для мене (Jupyter python, версія 3). Ви можете спробувати код нижче. Відповідно до офіційної документації, наведений нижче код повинен повернутись до параметрів за замовчуванням. Яке це зробило і для мене. > np.set_printoptions (edgeitems = 3, infstr = 'inf', ширина лінії = 75, nanstr = 'nan', точність = 8, придушити = False, поріг = 1000, формат = = None)
ewalel

Гаразд, це має бути тому, що я не використовую Юпітера. Однак прийнята відповідь працює для мене в чистому середовищі пітона.
Mathyou

Це означає threshold=0, що означає «усікати якомога швидше» - зовсім не те, що ви хочете.
Ерік

2

Припустимо, у вас є масивний ряд

 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
Ерік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.