φυβλαςのβλογ
บล็อกของ phyblas



numpy & matplotlib เบื้องต้น บทที่ ๓๔: อาเรย์ของจำนวนเชิงซ้อน
เขียนเมื่อ 2016/06/12 16:38
จำนวนเชิงซ้อน เป็นชนิดข้อมูลชนิดหนึ่งในภาษาไพธอน และมีลักษณะพิเศษที่มากกว่าจำนวนจริง จึงน่านำมากล่าวถึงแยกต่างหากเป็นพิเศษสักหน่อย

numpy มีคำสั่งต่างๆที่ช่วยในการจัดการกับจำนวนเชิงซ้อนภายในอาเรย์ทำให้การใช้งานทำได้สะดวก ซึ่งจะมาพูดถึงกันตรงนี้

สำหรับการจัดการกับจำนวนเชิงซ้อนในเบื้องต้นของภาษาไพธอนที่ไม่เกี่ยวกับ numpy อ่านได้ที่ https://phyblas.hinaboshi.com/20160608



การสร้างอาเรย์ของจำนวนเชิงซ้อน
ตอนที่ประกาศสร้างอาเรย์ขึ้นมาจากลิสต์หากมีสมาชิกเป็นจำนวนเชิงซ้อนแม้แต่ตัว เดียวก็จะได้ชนิดของอาเรย์เป็นจำนวนเชิงซ้อน สมาชิกตัวอื่นทั้งหมดก็จะเขียนอยู่ในรูปจำนวนเชิงซ้อนด้วย
import numpy as np
az = np.array([ 2,  1,  2+1j])
print(az) # ได้ [ 2.+0.j  1.+0.j  2.+1.j]
print(az.dtype) # ได้ dtype('complex128')

complex128 ในที่นี้เป็นชนิดข้อมูลจำนวนเชิงซ้อนมาตรฐานเมื่อสร้างจำนวนเชิงซ้อนขึ้นมา แล้วไม่กำหนดอะไรเพิ่มเติมก็จะได้ชนิดนี้ นอกจากนี้ยังมี complex64 กับ complex256 ด้วย สามารถกำหนดได้ตอนสร้าง

หรือหากสมาชิกเป็นจำนวนจริงแต่ระบุชนิดเป็นจำนวนเชิงซ้อนก็จะได้อาเรย์ของจำนวนเชิงซ้อนเช่นกัน
ay = np.array([3,4,5],dtype=complex)
print(ay) # ได้ [ 3.+0.j  4.+0.j  5.+0.j]
print(ay.dtype) # ได้ dtype('complex128')

หากระบุว่า complex เฉยๆจะได้ชนิด complex128 แต่ถ้าต้องการชนิด 'complex64' หรือ 'complex256' ก็ต้องระบุไปเป็นสายอักขระ
ay = np.array([3,4,5],dtype='complex64')

อาเรย์ของจำนวนจริงหากนำมาบวกกับจำนวนเชิงซ้อนก็จะเปลี่ยนได้ผลเป็น จำนวนเชิงซ้อนทันที จะใช้วิธีนี้ในการสร้างอาเรย์จำนวนเชิงซ้อนก็ได้
print(np.arange(1,8)+0j) # [ 1.+0.j  2.+0.j  3.+0.j  4.+0.j  5.+0.j  6.+0.j  7.+0.j]

เมื่ออาเรย์จำนวนจริงคูณกับจำนวนเชิงซ้อน ก็จะได้อาเรย์จำนวนเชิงซ้อนมา
print(np.arange(5)*1j) # ได้ [ 0.+0.j  0.+1.j  0.+2.j  0.+3.j  0.+4.j]

ดังนั้นอาจสร้างอาเรย์ของจำนวนเชิงซ้อนได้โดยการสร้างส่วนจริงและส่วนจินตภาพแยกกันแล้วนำมาบวกกันได้
az = np.arange(1,8)*3+np.arange(1,8)*4j
print(az) # ได้ [  3. +4.j   6. +8.j   9.+12.j  12.+16.j  15.+20.j  18.+24.j  21.+28.j]

ต้องระวังว่าอาเรย์ของจำนวนจริงต่อให้นำมาคำนวณยังไงก็ไม่อาจได้จำนวนเชิงซ้อน เช่นต่อให้รู้ว่าจำนวนติดลบยกกำลังแล้วควรจะได้จำนวนเชิงซ้อนก็ตาม
ayy = np.arange(-3,2)
print(ayy) # ได้ [-3 -2 -1  0  1]
print(ayy**0.5) # ได้ [ nan  nan  nan   0.   1.]

ลักษณะแบบนี้ไม่ว่าจะทำในไพธอน 3 หรือ 2 ก็ให้ผลแบบเดียวกัน

ดังนั้นจึงมีความจำเป็นต้องเปลี่ยนให้อยู่ในรูปเชิงซ้อนก่อน
print((ayy+0j)**0.5) # ได้ [ 0.+1.73205081j  0.+1.41421356j  0.+1.j          0.+0.j          1.+0.j        ]



ส่วนจริง, ส่วนจินตภาพ และสังยุค
ในการหาค่าส่วนจริงและส่วนจินตภาพของจำนวนเชิงซ้อนในอาเรย์อาจใช้ฟังก์ชัน np.real และ np.imag หรืออาจจะดูค่าเป็นแอตทริบิวต์ real และ imag ก็ได้เช่นกัน
ayz = np.arange(3,9)+np.arange(1,7)*1j
print(np.real(ayz)) # ได้ [ 3.  4.  5.  6.  7.  8.]
print(np.imag(ayz)) # ได้ [ 1.  2.  3.  4.  5.  6.]
print(ayz.real) # ได้ [ 3.  4.  5.  6.  7.  8.]
print(ayz.imag) # ได้ [ 1.  2.  3.  4.  5.  6.]

ส่วนค่าสังยุคหาได้จาก ฟังก์ชัน np.conj หรืออาจใช้เมธอด conj ก็ได้ (เป็นเมธอด ไม่ใช่แอตทริบิวต์ ต้องมีวงเล็บด้วย)
print(ayz.conj()) # ได้ [ 3.-1.j  4.-2.j  5.-3.j  6.-4.j  7.-5.j  8.-6.j]
print(np.conj(ayz)) # ได้ [ 3.-1.j  4.-2.j  5.-3.j  6.-4.j  7.-5.j  8.-6.j]



จำนวนเชิงซ้อนในรูปพิกัดเชิงขั้ว
จำนวนเชิงซ้อนอาจเขียนในรูปแบบเชิงขั้ว แสดงโดยค่าสัมบูรณ์ r และมุมเฟส θ ดังนี้


ค่าสัมบูรณ์หาได้โดยใช้ฟังก์ชัน np.abs หรือ np.absolute (ความจริงแล้วคือฟังก์ชันเดียวกัน np.abs เป็นแค่ชื่อย่อของ np.absolute)
azz = np.arange(-2,3)+np.arange(1,6)*2j
print(azz) # ได้ [-2. +2.j -1. +4.j  0. +6.j  1. +8.j  2.+10.j]
print(np.abs(azz)) # ได้ [  2.82842712   4.12310563   6.           8.06225775  10.19803903]

และมุมเฟสหาได้จากฟังก์ชัน np.angle
print(np.angle(azz)) # ได้ [ 2.35619449  1.81577499  1.57079633  1.44644133  1.37340077]

ลองนำมาวาดกราฟของแต่ละจุดโดยให้เส้นลากจากจุด 0 โดยให้แกนนอนเป็นส่วนจริงและแกนตั้งเป็นส่วนจินตภาพ
import matplotlib.pyplot as plt
plt.gca(xlim=[-7,8],ylim=[0,10])
for i in range(len(azz)):
    plt.plot([0,azz[i].real],[0,azz[i].imag])
plt.show()



ลองเขียนในรูปพิกัดเชิงขั้วโดยใช้ค่าสัมบูรณ์และมุมเฟส
plt.gca(polar=1)
for i in range(len(azz)):
    plt.plot([0,np.angle(azz[i])],[0,np.abs(azz[i])])
plt.show()



จะเห็นว่าได้กราฟออกมาเหมือนกัน



อ้างอิง


<< บทที่แล้ว     บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> numpy

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文