Python Force- ยับยั้งเครื่องหมายชี้แจงทั้งหมดเมื่อพิมพ์ลำดับ numpy, แก้ข้อผิดพลาดข้อความ, การปัดเศษและตัวเลือกการพิมพ์:
สิ่งต่อไปนี้คือคำอธิบายสำหรับสิ่งที่เกิดขึ้นเลื่อนไปที่ด้านล่างสำหรับการสาธิตรหัส
การส่งผ่านพารามิเตอร์suppress=True
ไปยังฟังก์ชันใช้set_printoptions
งานได้เฉพาะกับตัวเลขที่พอดีกับพื้นที่ 8 อักขระเริ่มต้นที่จัดสรรให้ดังนี้
import numpy as np
np.set_printoptions(suppress=True) #prevent numpy exponential
#notation on print, default False
# tiny med large
a = np.array([1.01e-5, 22, 1.2345678e7]) #notice how index 2 is 8
#digits wide
print(a) #prints [ 0.0000101 22. 12345678. ]
อย่างไรก็ตามหากคุณส่งผ่านตัวเลขที่มีความกว้างมากกว่า 8 ตัวอักษรจะมีการกำหนดสัญกรณ์เอ็กซ์โปเนนเชียลอีกครั้งเช่นนี้
np.set_printoptions(suppress=True)
a = np.array([1.01e-5, 22, 1.2345678e10]) #notice how index 2 is 10
#digits wide, too wide!
#exponential notation where we've told it not to!
print(a) #prints [1.01000000e-005 2.20000000e+001 1.23456780e+10]
numpy มีตัวเลือกระหว่างการสับหมายเลขของคุณครึ่งหนึ่งจึงเป็นการบิดเบือนความจริงหรือบังคับใช้สัญกรณ์แบบเอ็กซ์โปเนนเชียล
ที่นี่มาset_printoptions(formatter=...)
ช่วยเหลือเพื่อระบุตัวเลือกสำหรับการพิมพ์และการปัดเศษ บอกset_printoptions
ให้พิมพ์เพียงเปล่าลอย:
np.set_printoptions(suppress=True,
formatter={'float_kind':'{:f}'.format})
a = np.array([1.01e-5, 22, 1.2345678e30]) #notice how index 2 is 30
#digits wide.
#Ok good, no exponential notation in the large numbers:
print(a) #prints [0.000010 22.000000 1234567799999999979944197226496.000000]
เราได้บังคับให้ใช้สัญลักษณ์แบบเอ็กซ์โปเนนเชียล แต่ไม่ได้ถูกปัดเศษหรือเป็นธรรมดังนั้นให้ระบุตัวเลือกการจัดรูปแบบเพิ่มเติม:
np.set_printoptions(suppress=True,
formatter={'float_kind':'{:0.2f}'.format}) #float, 2 units
#precision right, 0 on left
a = np.array([1.01e-5, 22, 1.2345678e30]) #notice how index 2 is 30
#digits wide
print(a) #prints [0.00 22.00 1234567799999999979944197226496.00]
ข้อเสียเปรียบสำหรับการบังคับความคิดเลขชี้กำลังทั้งหมดใน ndarrays คือถ้า ndarray ของคุณได้รับค่า float ขนาดใหญ่ใกล้กับอนันต์ในนั้นและคุณพิมพ์มันคุณจะได้รับความเสียหายในหน้ากับหน้าเต็มของตัวเลข
ตัวอย่างเต็มรูปแบบ 1:
from pprint import pprint
import numpy as np
#chaotic python list of lists with very different numeric magnitudes
my_list = [[3.74, 5162, 13683628846.64, 12783387559.86, 1.81],
[9.55, 116, 189688622.37, 260332262.0, 1.97],
[2.2, 768, 6004865.13, 5759960.98, 1.21],
[3.74, 4062, 3263822121.39, 3066869087.9, 1.93],
[1.91, 474, 44555062.72, 44555062.72, 0.41],
[5.8, 5006, 8254968918.1, 7446788272.74, 3.25],
[4.5, 7887, 30078971595.46, 27814989471.31, 2.18],
[7.03, 116, 66252511.46, 81109291.0, 1.56],
[6.52, 116, 47674230.76, 57686991.0, 1.43],
[1.85, 623, 3002631.96, 2899484.08, 0.64],
[13.76, 1227, 1737874137.5, 1446511574.32, 4.32],
[13.76, 1227, 1737874137.5, 1446511574.32, 4.32]]
#convert python list of lists to numpy ndarray called my_array
my_array = np.array(my_list)
#This is a little recursive helper function converts all nested
#ndarrays to python list of lists so that pretty printer knows what to do.
def arrayToList(arr):
if type(arr) == type(np.array):
#If the passed type is an ndarray then convert it to a list and
#recursively convert all nested types
return arrayToList(arr.tolist())
else:
#if item isn't an ndarray leave it as is.
return arr
#suppress exponential notation, define an appropriate float formatter
#specify stdout line width and let pretty print do the work
np.set_printoptions(suppress=True,
formatter={'float_kind':'{:16.3f}'.format}, linewidth=130)
pprint(arrayToList(my_array))
พิมพ์:
array([[ 3.740, 5162.000, 13683628846.640, 12783387559.860, 1.810],
[ 9.550, 116.000, 189688622.370, 260332262.000, 1.970],
[ 2.200, 768.000, 6004865.130, 5759960.980, 1.210],
[ 3.740, 4062.000, 3263822121.390, 3066869087.900, 1.930],
[ 1.910, 474.000, 44555062.720, 44555062.720, 0.410],
[ 5.800, 5006.000, 8254968918.100, 7446788272.740, 3.250],
[ 4.500, 7887.000, 30078971595.460, 27814989471.310, 2.180],
[ 7.030, 116.000, 66252511.460, 81109291.000, 1.560],
[ 6.520, 116.000, 47674230.760, 57686991.000, 1.430],
[ 1.850, 623.000, 3002631.960, 2899484.080, 0.640],
[ 13.760, 1227.000, 1737874137.500, 1446511574.320, 4.320],
[ 13.760, 1227.000, 1737874137.500, 1446511574.320, 4.320]])
ตัวอย่างเต็มรูปแบบ 2:
import numpy as np
#chaotic python list of lists with very different numeric magnitudes
# very tiny medium size large sized
# numbers numbers numbers
my_list = [[0.000000000074, 5162, 13683628846.64, 1.01e10, 1.81],
[1.000000000055, 116, 189688622.37, 260332262.0, 1.97],
[0.010000000022, 768, 6004865.13, -99e13, 1.21],
[1.000000000074, 4062, 3263822121.39, 3066869087.9, 1.93],
[2.91, 474, 44555062.72, 44555062.72, 0.41],
[5, 5006, 8254968918.1, 7446788272.74, 3.25],
[0.01, 7887, 30078971595.46, 27814989471.31, 2.18],
[7.03, 116, 66252511.46, 81109291.0, 1.56],
[6.52, 116, 47674230.76, 57686991.0, 1.43],
[1.85, 623, 3002631.96, 2899484.08, 0.64],
[13.76, 1227, 1737874137.5, 1446511574.32, 4.32],
[13.76, 1337, 1737874137.5, 1446511574.32, 4.32]]
import sys
#convert python list of lists to numpy ndarray called my_array
my_array = np.array(my_list)
#following two lines do the same thing, showing that np.savetxt can
#correctly handle python lists of lists and numpy 2D ndarrays.
np.savetxt(sys.stdout, my_list, '%19.2f')
np.savetxt(sys.stdout, my_array, '%19.2f')
พิมพ์:
0.00 5162.00 13683628846.64 10100000000.00 1.81
1.00 116.00 189688622.37 260332262.00 1.97
0.01 768.00 6004865.13 -990000000000000.00 1.21
1.00 4062.00 3263822121.39 3066869087.90 1.93
2.91 474.00 44555062.72 44555062.72 0.41
5.00 5006.00 8254968918.10 7446788272.74 3.25
0.01 7887.00 30078971595.46 27814989471.31 2.18
7.03 116.00 66252511.46 81109291.00 1.56
6.52 116.00 47674230.76 57686991.00 1.43
1.85 623.00 3002631.96 2899484.08 0.64
13.76 1227.00 1737874137.50 1446511574.32 4.32
13.76 1337.00 1737874137.50 1446511574.32 4.32
0.00 5162.00 13683628846.64 10100000000.00 1.81
1.00 116.00 189688622.37 260332262.00 1.97
0.01 768.00 6004865.13 -990000000000000.00 1.21
1.00 4062.00 3263822121.39 3066869087.90 1.93
2.91 474.00 44555062.72 44555062.72 0.41
5.00 5006.00 8254968918.10 7446788272.74 3.25
0.01 7887.00 30078971595.46 27814989471.31 2.18
7.03 116.00 66252511.46 81109291.00 1.56
6.52 116.00 47674230.76 57686991.00 1.43
1.85 623.00 3002631.96 2899484.08 0.64
13.76 1227.00 1737874137.50 1446511574.32 4.32
13.76 1337.00 1737874137.50 1446511574.32 4.32
ขอให้สังเกตว่ามีความสอดคล้องปัดเศษที่ 2 หน่วยที่มีความแม่นยำและสัญกรณ์ชี้แจงถูกระงับทั้งในขนาดใหญ่มากe+x
และมีขนาดเล็กมากe-x
ช่วง
numpy.set_printoptions
ควบคุมวิธีการพิมพ์อาร์เรย์ numpy อย่างไรก็ตามไม่มีทางเลือกในการระงับข้อมูลทางวิทยาศาสตร์ทั้งหมด มันสลับไปมาเพราะคุณมีค่าตั้งแต่ 1e-2 ถึง 1e9 หากคุณมีช่วงที่เล็กลงมันจะไม่ใช้สัญลักษณ์ทางวิทยาศาสตร์เพื่อแสดง ทำไมมันถึงสำคัญว่ามันจะถูกแสดงด้วยprint
อย่างไร? หากคุณพยายามที่จะบันทึกมันใช้savetxt
ฯลฯ