বৈজ্ঞানিক স্বরলিপি ব্যতীত এবং প্রদত্ত নির্ভুলতার সাথে একটি নমপি.আর্রে কীভাবে প্রিন্ট করা যায়?


331

আমি কৌতূহলী, বিন্যাস ছাপার কোনও উপায় আছে কিনা numpy.arrays, উদাহরণস্বরূপ, এর সাথে একইভাবে:

x = 1.23456
print '%.3f' % x

যদি আমি numpy.arrayফ্লোটগুলির মুদ্রণ করতে চাই , তবে এটি বেশ কয়েকটি দশমিক প্রিন্ট করে, প্রায়শই 'বৈজ্ঞানিক' ফর্ম্যাটে, যা নিম্ন-মাত্রিক অ্যারেগুলির জন্য পড়তে বরং শক্ত। যাইহোক, numpy.arrayস্পষ্টতই একটি স্ট্রিং হিসাবে মুদ্রণ করতে হবে, সঙ্গে, সঙ্গে %s। এটির কোন সমাধান আছে?


এই আলোচনাটি গুগল অনুসন্ধানের মাধ্যমে এখানে শেষ হওয়া ব্যক্তিদেরও আগ্রহী হতে পারে।
2213 এ

উত্তর:


557

আপনি set_printoptionsআউটপুটটির নির্ভুলতা নির্ধারণ করতে ব্যবহার করতে পারেন :

import numpy as np
x=np.random.random(10)
print(x)
# [ 0.07837821  0.48002108  0.41274116  0.82993414  0.77610352  0.1023732
#   0.51303098  0.4617183   0.33487207  0.71162095]

np.set_printoptions(precision=3)
print(x)
# [ 0.078  0.48   0.413  0.83   0.776  0.102  0.513  0.462  0.335  0.712]

এবং suppressস্বল্প সংখ্যার জন্য বৈজ্ঞানিক স্বরলিপি ব্যবহার দমন করে:

y=np.array([1.5e-10,1.5,1500])
print(y)
# [  1.500e-10   1.500e+00   1.500e+03]
np.set_printoptions(suppress=True)
print(y)
# [    0.      1.5  1500. ]

অন্যান্য বিকল্পের জন্য সেট_প্রিন্টপশনগুলির জন্য ডকগুলি দেখুন ।


স্থানীয়ভাবে মুদ্রণ বিকল্পগুলি প্রয়োগ করতে , NumPy 1.15.0 বা তার পরে ব্যবহার করে, আপনি numpy.printoptions প্রসঙ্গ পরিচালক ব্যবহার করতে পারেন । উদাহরণস্বরূপ, এর ভিতরে with-suite precision=3এবং suppress=Trueসেট করা আছে:

x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

তবে with-suiteমুদ্রণের বিকল্পগুলি ডিফল্ট সেটিংসে ফিরে আসে:

print(x)    
# [ 0.07334334  0.46132615  0.68935231  0.75379645  0.62424021  0.90115836
#   0.04879837  0.58207504  0.55694118  0.34768638]

আপনি যদি NumPy এর পূর্ববর্তী সংস্করণ ব্যবহার করে থাকেন তবে আপনি নিজে প্রসঙ্গ পরিচালককে তৈরি করতে পারেন। উদাহরণ স্বরূপ,

import numpy as np
import contextlib

@contextlib.contextmanager
def printoptions(*args, **kwargs):
    original = np.get_printoptions()
    np.set_printoptions(*args, **kwargs)
    try:
        yield
    finally: 
        np.set_printoptions(**original)

x = np.random.random(10)
with printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

ভাসমানের শেষে থেকে শূন্যগুলি ছিনিয়ে নেওয়া থেকে রোধ করতে:

np.set_printoptionsএখন একটি formatterপ্যারামিটার রয়েছে যা আপনাকে প্রতিটি ধরণের জন্য একটি ফর্ম্যাট ফাংশন নির্দিষ্ট করতে দেয়।

np.set_printoptions(formatter={'float': '{: 0.3f}'.format})
print(x)

যা প্রিন্ট করে

[ 0.078  0.480  0.413  0.830  0.776  0.102  0.513  0.462  0.335  0.712]

পরিবর্তে

[ 0.078  0.48   0.413  0.83   0.776  0.102  0.513  0.462  0.335  0.712]

কেবলমাত্র নির্দিষ্ট মুদ্রণ বিবৃতিতে ( সমস্ত মুদ্রণ বিবৃতি ব্যবহার করে একটি সাধারণ আউটপুট ফর্ম্যাট সেট করার বিপরীতে) বিন্যাস প্রয়োগ করার উপায় আছে কি?
বিপিএফ

7
@ হাইট: কেবলমাত্র একটির জন্য মুদ্রণ বিকল্পগুলি সেট করতে কোনও NumPy ফাংশন নেই print, তবে আপনি অনুরূপ কিছু তৈরি করতে কোনও প্রসঙ্গ পরিচালককে ব্যবহার করতে পারেন। আমি কী বলতে চাইছি তা বোঝাতে আমি উপরে পোস্টটি সম্পাদনা করেছি।
unutbu

2
আপনার np.set_printoptions(precision=3)শেষ শূন্যগুলি দমন করুন .. আপনি কীভাবে তাদের এভাবে প্রদর্শিত হতে পারেন [ 0.078 0.480 0.413 0.830 0.776 0.102 0.513 0.462 0.335 0.712]?
নরফেল্ড

2
@ নরফেল্ট: আমি উপরে এটি করার একটি উপায় যুক্ত করেছি।
unutbu

1
এটি দুর্দান্ত কাজ করে। পার্শ্ব নোট হিসাবে, আপনি set_printoptionsযদি স্ট্রিং প্রতিনিধিত্ব চান এবং প্রয়োজনীয়ভাবে ব্যবহার না করেন তবে আপনি এটিও ব্যবহার করতে পারেন print। আপনি কেবল __str__()নমপি অ্যারের উদাহরণটি কল করতে পারেন এবং আপনার সেট করা প্রিন্টপশন অনুযায়ী ফর্ম্যাট স্ট্রিংটি পাবেন।
জয়েশ

40

আপনি কমান্ড np.set_printoptionsথেকে কার্যকারিতার একটি উপসেট পেতে পারেন np.array_str, যা কেবলমাত্র একক মুদ্রণ বিবৃতিতে প্রযোজ্য।

http://docs.scipy.org/doc/numpy/reference/generated/numpy.array_str.html

উদাহরণ স্বরূপ:

In [27]: x = np.array([[1.1, 0.9, 1e-6]]*3)

In [28]: print x
[[  1.10000000e+00   9.00000000e-01   1.00000000e-06]
 [  1.10000000e+00   9.00000000e-01   1.00000000e-06]
 [  1.10000000e+00   9.00000000e-01   1.00000000e-06]]

In [29]: print np.array_str(x, precision=2)
[[  1.10e+00   9.00e-01   1.00e-06]
 [  1.10e+00   9.00e-01   1.00e-06]
 [  1.10e+00   9.00e-01   1.00e-06]]

In [30]: print np.array_str(x, precision=2, suppress_small=True)
[[ 1.1  0.9  0. ]
 [ 1.1  0.9  0. ]
 [ 1.1  0.9  0. ]]

37

আনুতবু সত্যই সম্পূর্ণ উত্তর দিয়েছেন (তারা আমার কাছ থেকেও একটি +1 পেয়েছিল), তবে এখানে একটি লো-টেক বিকল্প রয়েছে:

>>> x=np.random.randn(5)
>>> x
array([ 0.25276524,  2.28334499, -1.88221637,  0.69949927,  1.0285625 ])
>>> ['{:.2f}'.format(i) for i in x]
['0.25', '2.28', '-1.88', '0.70', '1.03']

একটি ফাংশন হিসাবে ( format()বিন্যাসের জন্য সিনট্যাক্স ব্যবহার করে ):

def ndprint(a, format_string ='{0:.2f}'):
    print [format_string.format(v,i) for i,v in enumerate(a)]

ব্যবহার:

>>> ndprint(x)
['0.25', '2.28', '-1.88', '0.70', '1.03']

>>> ndprint(x, '{:10.4e}')
['2.5277e-01', '2.2833e+00', '-1.8822e+00', '6.9950e-01', '1.0286e+00']

>>> ndprint(x, '{:.8g}')
['0.25276524', '2.283345', '-1.8822164', '0.69949927', '1.0285625']

বিন্যাসের স্ট্রিংটিতে অ্যারের সূচকটি অ্যাক্সেসযোগ্য:

>>> ndprint(x, 'Element[{1:d}]={0:.2f}')
['Element[0]=0.25', 'Element[1]=2.28', 'Element[2]=-1.88', 'Element[3]=0.70', 'Element[4]=1.03']

15

এফওয়াইআই নম্পি 1.15 (মুক্তির তারিখ মুলতুবি) স্থানীয়ভাবে মুদ্রণ বিকল্পগুলি সেট করার জন্য একটি প্রসঙ্গ পরিচালককে অন্তর্ভুক্ত করবে । এর অর্থ হ'ল নীচেরগুলি আপনার নিজস্ব প্রসঙ্গে পরিচালক না লিখে স্বীকৃত উত্তরে (আনটবু এবং নীল জি দ্বারা) সম্পর্কিত উদাহরণ হিসাবে একই কাজ করবে । উদাহরণস্বরূপ, তাদের উদাহরণ ব্যবহার করে:

x = np.random.random(10)
with np.printoptions(precision=3, suppress=True):
    print(x)
    # [ 0.073  0.461  0.689  0.754  0.624  0.901  0.049  0.582  0.557  0.348]

12

স্ট্রিং হিসাবে (আজকের অদ্ভুত সংস্করণগুলিতে) ফলাফলটি পাওয়া খুব সহজ করে তোলে এমন রত্নটি ড্যানিস উত্তরে লুকিয়ে রয়েছে: np.array2string

>>> import numpy as np
>>> x=np.random.random(10)
>>> np.array2string(x, formatter={'float_kind':'{0:.3f}'.format})
'[0.599 0.847 0.513 0.155 0.844 0.753 0.920 0.797 0.427 0.420]'

8

বছর কয়েক পরে, অন্য এক নীচে। তবে আমি প্রতিদিনের ব্যবহারের জন্য

np.set_printoptions( threshold=20, edgeitems=10, linewidth=140,
    formatter = dict( float = lambda x: "%.3g" % x ))  # float arrays %.3g

''' printf( "... %.3g ... %.1f  ...", arg, arg ... ) for numpy arrays too

Example:
    printf( """ x: %.3g   A: %.1f   s: %s   B: %s """,
                   x,        A,        "str",  B )

If `x` and `A` are numbers, this is like `"format" % (x, A, "str", B)` in python.
If they're numpy arrays, each element is printed in its own format:
    `x`: e.g. [ 1.23 1.23e-6 ... ]  3 digits
    `A`: [ [ 1 digit after the decimal point ... ] ... ]
with the current `np.set_printoptions()`. For example, with
    np.set_printoptions( threshold=100, edgeitems=3, suppress=True )
only the edges of big `x` and `A` are printed.
`B` is printed as `str(B)`, for any `B` -- a number, a list, a numpy object ...

`printf()` tries to handle too few or too many arguments sensibly,
but this is iffy and subject to change.

How it works:
numpy has a function `np.array2string( A, "%.3g" )` (simplifying a bit).
`printf()` splits the format string, and for format / arg pairs
    format: % d e f g
    arg: try `np.asanyarray()`
-->  %s  np.array2string( arg, format )
Other formats and non-ndarray args are left alone, formatted as usual.

Notes:

`printf( ... end= file= )` are passed on to the python `print()` function.

Only formats `% [optional width . precision] d e f g` are implemented,
not `%(varname)format` .

%d truncates floats, e.g. 0.9 and -0.9 to 0; %.0f rounds, 0.9 to 1 .
%g is the same as %.6g, 6 digits.
%% is a single "%" character.

The function `sprintf()` returns a long string. For example,
    title = sprintf( "%s  m %g  n %g  X %.3g",
                    __file__, m, n, X )
    print( title )
    ...
    pl.title( title )

Module globals:
_fmt = "%.3g"  # default for extra args
_squeeze = np.squeeze  # (n,1) (1,n) -> (n,) print in 1 line not n

See also:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.set_printoptions.html
http://docs.python.org/2.7/library/stdtypes.html#string-formatting

'''
# http://stackoverflow.com/questions/2891790/pretty-printing-of-numpy-array


#...............................................................................
from __future__ import division, print_function
import re
import numpy as np

__version__ = "2014-02-03 feb denis"

_splitformat = re.compile( r'''(
    %
    (?<! %% )  # not %%
    -? [ \d . ]*  # optional width.precision
    \w
    )''', re.X )
    # ... %3.0f  ... %g  ... %-10s ...
    # -> ['...' '%3.0f' '...' '%g' '...' '%-10s' '...']
    # odd len, first or last may be ""

_fmt = "%.3g"  # default for extra args
_squeeze = np.squeeze  # (n,1) (1,n) -> (n,) print in 1 line not n

#...............................................................................
def printf( format, *args, **kwargs ):
    print( sprintf( format, *args ), **kwargs )  # end= file=

printf.__doc__ = __doc__


def sprintf( format, *args ):
    """ sprintf( "text %.3g text %4.1f ... %s ... ", numpy arrays or ... )
        %[defg] array -> np.array2string( formatter= )
    """
    args = list(args)
    if not isinstance( format, basestring ):
        args = [format] + args
        format = ""

    tf = _splitformat.split( format )  # [ text %e text %f ... ]
    nfmt = len(tf) // 2
    nargs = len(args)
    if nargs < nfmt:
        args += (nfmt - nargs) * ["?arg?"]
    elif nargs > nfmt:
        tf += (nargs - nfmt) * [_fmt, " "]  # default _fmt

    for j, arg in enumerate( args ):
        fmt = tf[ 2*j + 1 ]
        if arg is None \
        or isinstance( arg, basestring ) \
        or (hasattr( arg, "__iter__" ) and len(arg) == 0):
            tf[ 2*j + 1 ] = "%s"  # %f -> %s, not error
            continue
        args[j], isarray = _tonumpyarray(arg)
        if isarray  and fmt[-1] in "defgEFG":
            tf[ 2*j + 1 ] = "%s"
            fmtfunc = (lambda x: fmt % x)
            formatter = dict( float_kind=fmtfunc, int=fmtfunc )
            args[j] = np.array2string( args[j], formatter=formatter )
    try:
        return "".join(tf) % tuple(args)
    except TypeError:  # shouldn't happen
        print( "error: tf %s  types %s" % (tf, map( type, args )))
        raise


def _tonumpyarray( a ):
    """ a, isarray = _tonumpyarray( a )
        ->  scalar, False
            np.asanyarray(a), float or int
            a, False
    """
    a = getattr( a, "value", a )  # cvxpy
    if np.isscalar(a):
        return a, False
    if hasattr( a, "__iter__" )  and len(a) == 0:
        return a, False
    try:
        # map .value ?
        a = np.asanyarray( a )
    except ValueError:
        return a, False
    if hasattr( a, "dtype" )  and a.dtype.kind in "fi":  # complex ?
        if callable( _squeeze ):
            a = _squeeze( a )  # np.squeeze
        return a, True
    else:
        return a, False


#...............................................................................
if __name__ == "__main__":
    import sys

    n = 5
    seed = 0
        # run this.py n= ...  in sh or ipython
    for arg in sys.argv[1:]:
        exec( arg )
    np.set_printoptions( 1, threshold=4, edgeitems=2, linewidth=80, suppress=True )
    np.random.seed(seed)

    A = np.random.exponential( size=(n,n) ) ** 10
    x = A[0]

    printf( "x: %.3g  \nA: %.1f  \ns: %s  \nB: %s ",
                x,         A,         "str",   A )
    printf( "x %%d: %d", x )
    printf( "x %%.0f: %.0f", x )
    printf( "x %%.1e: %.1e", x )
    printf( "x %%g: %g", x )
    printf( "x %%s uses np printoptions: %s", x )

    printf( "x with default _fmt: ", x )
    printf( "no args" )
    printf( "too few args: %g %g", x )
    printf( x )
    printf( x, x )
    printf( None )
    printf( "[]:", [] )
    printf( "[3]:", [3] )
    printf( np.array( [] ))
    printf( [[]] )  # squeeze

6

এবং আমি এখানে যা ব্যবহার করি তা এখানে রয়েছে এবং এটি বেশ জটিল:

print(np.vectorize("%.2f".__mod__)(sparse))

3

aroundউল্লিখিত পদ্ধতিটি না দেখে অবাক হয়েছিল - এর অর্থ মুদ্রণ বিকল্পগুলির সাথে গোলযোগ নেই।

import numpy as np

x = np.random.random([5,5])
print(np.around(x,decimals=3))

Output:
[[0.475 0.239 0.183 0.991 0.171]
 [0.231 0.188 0.235 0.335 0.049]
 [0.87  0.212 0.219 0.9   0.3  ]
 [0.628 0.791 0.409 0.5   0.319]
 [0.614 0.84  0.812 0.4   0.307]]

2

আমি প্রায়শই বিভিন্ন কলামের বিভিন্ন ফর্ম্যাট থাকতে চাই। এখানে আমি কীভাবে আমার নুমপি অ্যারেটিকে একটি টুপলে রূপান্তর করে ফরম্যাটে বিভিন্ন ধরণের ব্যবহার করে একটি সাধারণ 2 ডি অ্যারে প্রিন্ট করব:

import numpy as np
dat = np.random.random((10,11))*100  # Array of random values between 0 and 100
print(dat)                           # Lines get truncated and are hard to read
for i in range(10):
    print((4*"%6.2f"+7*"%9.4f") % tuple(dat[i,:]))

1

numpy.char.modআপনার অ্যাপ্লিকেশনটির বিশদগুলির উপর নির্ভর করে দরকারী হতে পারে যেমন: numpy.char.mod('Value=%4.2f', numpy.arange(5, 10, 0.1))"মান = 5.00", "মান = 5.10" ইত্যাদি উপাদানগুলির সাথে একটি স্ট্রিং অ্যারে ফিরিয়ে দেবে (কিছুটা স্বল্প উদাহরণ হিসাবে)।


1

নম্পি অ্যারেতে এমন পদ্ধতি রয়েছে round(precision)যা ততক্ষণে গোলাকার উপাদানগুলির সাথে একটি নতুন নিম্পি অ্যারে প্রদান করে।

import numpy as np

x = np.random.random([5,5])
print(x.round(3))

1
এটি ম্যাটপ্ল্লোব ইলাবেলে অ্যারে পাস করার সময় আমার পক্ষে কাজ করেছিল, ধন্যবাদ
হ্যান্স

1

আমি দেখতে পেয়েছি যে স্বাভাবিক ফ্লোট ফর্ম্যাটটি}: 9.5f properly সঠিকভাবে কাজ করে - ছোট-মান ই-নোটেশন দমন করে - যখন লুপ ব্যবহার করে একটি তালিকা বা অ্যারে প্রদর্শন করে। তবে কোনও ফর্ম্যাটরটিতে একটি মুদ্রণ বিবৃতিতে বেশ কয়েকটি আইটেম থাকে তা ফর্ম্যাট কখনও কখনও তার ই-স্বীকৃতি দমন করতে ব্যর্থ হয়। উদাহরণ স্বরূপ:

import numpy as np
np.set_printoptions(suppress=True)
a3 = 4E-3
a4 = 4E-4
a5 = 4E-5
a6 = 4E-6
a7 = 4E-7
a8 = 4E-8
#--first, display separate numbers-----------
print('Case 3:  a3, a4, a5:             {:9.5f}{:9.5f}{:9.5f}'.format(a3,a4,a5))
print('Case 4:  a3, a4, a5, a6:         {:9.5f}{:9.5f}{:9.5f}{:9.5}'.format(a3,a4,a5,a6))
print('Case 5:  a3, a4, a5, a6, a7:     {:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7))
print('Case 6:  a3, a4, a5, a6, a7, a8: {:9.5f}{:9.5f}{:9.5f}{:9.5f}{:9.5}{:9.5f}'.format(a3,a4,a5,a6,a7,a8))
#---second, display a list using a loop----------
myList = [a3,a4,a5,a6,a7,a8]
print('List 6:  a3, a4, a5, a6, a7, a8: ', end='')
for x in myList: 
    print('{:9.5f}'.format(x), end='')
print()
#---third, display a numpy array using a loop------------
myArray = np.array(myList)
print('Array 6: a3, a4, a5, a6, a7, a8: ', end='')
for x in myArray:
    print('{:9.5f}'.format(x), end='')
print()

আমার ফলাফলগুলি 4, 5 এবং 6 ক্ষেত্রে বাগটি দেখায়:

Case 3:  a3, a4, a5:               0.00400  0.00040  0.00004
Case 4:  a3, a4, a5, a6:           0.00400  0.00040  0.00004    4e-06
Case 5:  a3, a4, a5, a6, a7:       0.00400  0.00040  0.00004    4e-06  0.00000
Case 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000    4e-07  0.00000
List 6:  a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000
Array 6: a3, a4, a5, a6, a7, a8:   0.00400  0.00040  0.00004  0.00000  0.00000  0.00000

এর জন্য আমার কোনও ব্যাখ্যা নেই এবং তাই আমি সর্বদা একাধিক মানের ভাসমান আউটপুট জন্য একটি লুপ ব্যবহার করি।


1

আমি ব্যবহার করি

def np_print(array,fmt="10.5f"):
    print (array.size*("{:"+fmt+"}")).format(*array)

বহুমাত্রিক অ্যারেগুলির জন্য এটি সংশোধন করা কঠিন নয়।


0

তবুও অন্য বিকল্পটি হল decimalমডিউলটি ব্যবহার করা :

import numpy as np
from decimal import *

arr = np.array([  56.83,  385.3 ,    6.65,  126.63,   85.76,  192.72,  112.81, 10.55])
arr2 = [str(Decimal(i).quantize(Decimal('.01'))) for i in arr]

# ['56.83', '385.30', '6.65', '126.63', '85.76', '192.72', '112.81', '10.55']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.