a = np.array([[1,0,1],[1,0,1]])
b = np.array([[1,1,0],[0,0,1]])
print(np.any(a==b)) # ได้ True
print(np.all(a<=b)) # ได้ False
print(np.any(a>b)) # ได้ True
การเทียบว่าอาเรย์เท่ากันหรือเปล่า ในบางครั้งอาเรย์ที่ไม่เหมือนกันพอมาเปรียบเทียบกันก็อาจพบว่าได้เท่ากันได้ เช่น
a = np.array([3,0,3])
b = np.array([3,0,3,3,0,3,3,0,3]).reshape(3,3)
print(a==b)
# ได้
# [[ True True True]
# [ True True True]
# [ True True True]]
print(a-b)
# ได้
# [[0 0 0]
# [0 0 0]
# [0 0 0]]
print(np.all(a==b)) # ได้ True
นั่นเพราะอาเรย์มีสมบัติการกระจาย ทำให้แม้ว่า a และ b จะไม่เหมือนกัน แต่พอเทียบกันแล้วก็พบว่าได้ True ทั้งหมด พอใช้ np.all ก็ยังจะได้ True ผลลัพธ์แบบนี้อาจไม่พึงประสงค์ในบางครั้ง ดังนั้นจะต้องหาทางอื่น
การจะเทียบให้เหมือนเป๊ะแบบตัวต่อตัวเลยจริงๆจะต้องใช้ฟังก์ชัน np.array_equal
np.array_equal จะเทียบว่าอาเรย์สองตัวเหมือนกันทั้งขนาดและสมาชิกข้างในหรือเปล่า
print(np.array_equal(a,b)) # ได้ False
และมีอีกฟังก์ชันที่คล้ายๆกัน แต่จริงๆแล้วให้ผลไม่ต่างจาก np.all(a==b) นั่นคือ np.array_equiv
np.array_equiv จะพิจารณาว่าอาเรย์สองตัวลบกันแล้วได้อาเรย์ที่มีแต่ 0 หรือเปล่า โดยพิจารณาถึงสมบัติการกระจายด้วย
print(np.array_equiv(a,b)) # ได้ True
การเปรียบเทียบจำนวนที่ใกล้เคียงกันมากๆ ในบางครั้งการที่จะบอกว่าตัวเลขสองตัวนั้นเท่ากันนั้นก็ไม่ได้หมายความว่าจะต้องเท่ากันพอดีเป๊ะ โดยเฉพาะตัวเลขที่ได้มาจากการทดลองต่างๆย่อมมีความคลาดเคลื่อนอยู่ในตัว ดังนั้นแม้จะไม่เท่ากันพอดีเราก็อาจถือว่าเป็นค่าที่เท่ากัน
ในกรณีแบบนี้แทนที่จะใช้การเปรียบเทียบแบบธรรมดาอาจจะใช้ฟังก์ช้น np.isclose
np.isclose เป็นฟังก์ชันสำหรับตรวจสอบว่าค่าตัวเลขสองตัวนั้นใกล้กันมากพอหรือเปล่า ถ้าใกล้กันมากพอก็จะคืนค่า True
ความใกล้เคียงนั้นอาจเทียบเป็นสัมบูรณ์หรือสัมพัทธ์ก็ได้ โดยกำหนดที่คีย์เวิร์ด
หากต้องการเปรียบเทียบแบบสัมพัทธ์ให้ใส่เป็นอาร์กิวเมนต์ตัวที่ ๓ ต่อจากค่าตัวเลข ๒ ตัว
ตัวอย่าง ลองเทียบ 100 กับ 101
print(np.isclose(100,101,0.01)) # ได้ True
print(np.isclose(100,101,0.001)) # ได้ False
ค่าสัมพัทธ์ที่ว่านี้คิดจากค่าตัวเลขตัวหลังไม่ใช่ตัวหน้า ดังนั้นการสลับตำแหน่งอาร์กิวเมนต์ ๒ ตัวหน้าจะให้ผลต่างกัน
print(np.isclose(100,99,0.01)) # ได้ False
print(np.isclose(99,100,0.01)) # ได้ True
ที่เป็นแบบนี้เนื่องจาก (100-99)/99 = 0.010101010101... ซึ่งมากกว่า 0.01 ดังนั้นจึงเป็นเท็จ
แต่ (100-99)/100 = 0.01 พอดิบพอดี ดังนั้นจึงเป็นจริง
กรณีที่ไม่ได้กำหนดค่าความต่างสัมพัทธ์จะเทียบเป็น 0.00001
print(np.isclose(99.999,100.000)) # ได้ True
print(np.isclose(99.99,100.00)) # ได้ False
หากต้องการเปรียบเทียบแบบสมบูรณ์ก็ใส่คีย์เวิร์ด atol
print(np.isclose(5.001,5,atol=0.0001)) # ได้ False
print(np.isclose(5.001,5,atol=0.001)) # ได้ True
ต่อให้เลขต่างกันกี่เท่า ถ้ากำหนดการเปรียบเทียบแบบสมบูรณ์ก็ยังได้ True อยู่ดี
print(np.isclose(0.00002,0.00001,atol=0.00001)) # ได้ True
ค่าตั้งต้นของ atol คือ 0.00000001 หรือ 10 ยกกำลัง -8 ดังนั้นต่อให้ ไม่กำหนด atol พอเปรียบเทียบค่าที่ต่ำกว่านั้นก็ได้ True อยู่ดี
print(np.isclose(0.00000002,0.00000001)) # ได้ False
กรณี ที่ใส่ทั้งค่าความต่างสัมบูรณ์และสัมพัทธ์ไปพร้อมกันจะใส่ค่าความต่าง สัมบูรณ์เป็นอาร์กิวเมนต์ตัวที่ ๔ โดยไม่ต้องเติม atol= ก็ได้ เพียงแต่การเปรียบเทียบจะให้ค่า True ทันทีที่เงื่อนไขอันใดอันหนึ่งเป็นจริง
print(np.isclose(0.002,0.001,0.01,0.001)) # ได้ True
print(np.isclose(0.002,0.001,0.01,0.0001)) # ได้ False
print(np.isclose(0.002,0.001,1,0.0001)) # ได้ True
เนื่องจากค่าตั้งต้นของ atol เป็น 0.00000001 ดังนั้นถ้าตัวเลขน้อยกว่านั้นไม่ว่าจะเปรียบเทียบยังไงก็จะได้ True ตลอดไม่ว่าจะใส่ค่าความต่างสัมพัทธ์ไว้สูงก็ตาม ดังนั้นทางแก้คือต้องใส่ 0 ต่อท้าย
print(np.isclose(0.000000002,0.000000001,0.0000001)) # ได้ True
print(np.isclose(0.000000002,0.000000001,0.0000001,0)) # ได้ False
หากใช้กับอาเรย์หรือลิสต์ก็จะทำการเปรียบเทียบสมาชิกแต่ละตัวแล้วคืนค่าอาเรย์ของค่าความจริงเท็จ
print(np.isclose([100,100,100],[100.1,101,110],0.01)) # ได้ [ True True False]
นอกจากนี้ก็มีฟังก์ชัน np.allclose ซึ่งจะคืนค่า True ต่อเมื่อสมาชิกทั้งหมดใกล้กันมากพอ (ก็คือใช้ np.isclose แล้วได้ True ทุกตัว)
print(np.allclose([100,100,100],[100.1,101,110],0.01)) # ได้ False
print(np.allclose([100,100,100],[100.1,101,110],0.1)) # ได้ True
np.minimum และ np.maximum บางครั้งเราอาจมี ๒ ฟังก์ชันที่ต้องการนำมาเปรียบเทียบกันแล้วคัดเอาค่าที่สูงกว่าหรือต่ำกว่า ระหว่าง ๒ ฟังก์ชันนั้น ในกรณีนี้อาจใช้ np.minimum และ np.maximum
np.minimum จะนำเอาอาเรย์ ๒ ตัวที่มีขนาดเท่ากันมาเทียบกันแล้วคืนอาเรย์ที่ประกอบไปด้วยค่าที่ต่ำกว่า
ตัวอย่าง ลองดูกราฟที่ได้จาก np.minimum ระหว่าง sin และ cos
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,15,101)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,':m')
plt.plot(x,y2,':c')
y = np.minimum(y1,y2)
plt.stem(x,y,markerfmt='-g')
plt.show()
ส่วน np.maximum นั้นก็เช่นเดียวกัน แต่จะคืนค่าสูงสุด
จากตัวอย่างบน ลองแก้แค่ ๓ บรรทัดล่าง
y = np.maximum(y1,y2)
plt.stem(x,y,markerfmt='-y')
plt.show()
อ้างอิง