11: NumPy

11-3: Scalar Operation

** ถ้าใช้งานบนมือถือหรือ tablet แนะนำให้ใช้ Chrome หรือ Safari เท่านั้น **

แบบฝึกหัด 11-3 ข้อที่ 1

จงเติมคำสั่งในบรรทัดที่ให้ค่ากับตัวแปร y เพื่อให้ yi = 2(xi)2 - 5 สำหรับทุกค่าของ i (แก้ไขบรรทัด y = ___ บรรทัดเดียว ไม่ต้องแก้ไขบรรทัดอื่น ๆ)

import matplotlib.pyplot as plt import numpy as np x = np.arange(-5.0, 5.0, 0.1) y = _________ plt.plot(x, y) plt.show() import matplotlib.pyplot as plt import numpy as np x = np.arange(-5.0, 5.0, 0.1) y = 2*x**2 - 5 plt.plot(x, y) plt.show() Ex().check_function('matplotlib.pyplot.plot', missing_msg = "ฟังก์ชัน plot หายไปไหน ?").\ check_args(["args", 1]).has_equal_value(incorrect_msg="ยังไม่ถูกต้อง: โจทย์ให้พล็อต กำลังสองของ x")
แบบฝึกหัด 11-3 ข้อที่ 2

จงเติมคำสั่งในบรรทัดที่ให้ค่ากับตัวแปร x กับ y โดย x เก็บมุม 0, 1, 2, ..., 360 องศา ส่วน y เก็บค่า sin(x) คือให้ yi = sin(xi) สำหรับทุกค่าของ i (แก้ไขบรรทัด x = และ y = เท่านั้น ไม่ต้องแก้ไขบรรทัดอื่น ๆ)

import matplotlib.pyplot as plt import numpy as np x = ________ y = ________ plt.plot(x, y) plt.show() import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 361, 1) y = np.sin(np.radians(x)) plt.plot(x, y) plt.show() Ex().check_function('matplotlib.pyplot.plot', missing_msg = "ฟังก์ชัน plot หายไปไหน ?").multi( check_args(["args", 0]).has_equal_value( incorrect_msg="ยังไม่ถูกต้อง: โจทย์ให้พล็อต x จาก 0,1,2,..,360 องศา"), check_args(["args", 1]).has_equal_value( incorrect_msg="ยังไม่ถูกต้อง: โจทย์ให้พล็อต y = sin(x)") )
ใช้ arange(0,361,1) และก็อย่าลืมเปลี่ยนเป็นเรเดียนด้วยตอนจะหาค่า sin
แบบฝึกหัด 11-3 ข้อที่ 3

เขียนคำสั่งเพื่อสร้างอาเรย์ในตัวแปรชื่อต่อไปนี้ (ไม่ใช้คำสั่งวงวน)

  • a1 ขนาด 10x10 ทุกช่องมีค่า -3
  • a2 ขนาด 10x10 แถวคู่เป็น 2 ทุกตัว แถวคี่เป็น 7 ทุกตัว
  • a3 ขนาด 10x10 ทุกช่องเป็น 0 ยกเว้นในแนวทแยงมุมจากซ้ายบนลงมาขวาล่างเป็น 9
  • a4 ขนาด 10x10 ทุกช่องเป็น 0 ยกเว้นในแนวทแยงมุมจากขวาบนลงมาซ้ายล่างเป็น 9

import numpy as np import numpy as np a1 = np.ndarray((10,10), int) a1[:,:] = -3 a2 = np.ndarray((10,10), int) a2[::2, :] = 2 a2[1::2, :] = 7 ir = np.arange(0, 10, 1) a3 = np.zeros((10,10), int) a3[ir,ir] = 9 a4 = np.zeros((10,10), int) a4[ir,ir[::-1]] = 9 Ex().check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") vars = ['a1', 'a2', 'a3', 'a4'] for v in vars: obj = Ex().check_object(v, missing_msg = "ไม่มีตัวแปร `" + v + "`") obj.has_equal_value(expr_code = "type("+v+")", incorrect_msg = "`" + v + "` ต้องเป็น numpy array") obj.has_equal_value(expr_code = v+".dtype", incorrect_msg = "`" + v + "` เก็บข้อมูลที่มีประเภทข้อมูลไม่ตรงตามโจทย์") obj.has_equal_value(incorrect_msg = "`" + v + "` มีค่าไม่ตรงตามโจทย์")
แบบฝึกหัด 11-3 ข้อที่ 4

กำหนดให้มี A เป็นอาเรย์หนึ่งมิติ (มีให้แล้ว) จงเขียนคำสั่งเพื่อนำข้อมูลจาก A มาสร้างอาเรย์ใหม่ในตัวแปรชื่อต่อไปนี้ (ไม่ใช้คำสั่งวงวน)

  • a1 เก็บจำนวนของข้อมูลใน A ที่มีค่าติดลบ
  • a2 เป็นอาเรย์เก็บข้อมูลใน A ทั้งหมดที่มีค่าติดลบ (ลำดับก่อนหลังเดียวกับที่อยู่ใน A)
  • a3 เป็นอาเรย์เก็บอินเด็กซ์ของ A ทั้งหมดที่มีค่าติดลบ (ลำดับก่อนหลังเดียวกับที่อยู่ใน A)
  • a4 เป็นอาเรย์เก็บข้อมูลใน A ทั้งหมดที่มีค่าตั้งแต่ -5 ถึง 5 (ลำดับก่อนหลังเดียวกับที่อยู่ใน A)

import numpy as np A = np.array([-10, -5, -2, 0, 5, 33]) import numpy as np import numpy as np a1 = sum(A < 0) a2 = A[A < 0] a3 = np.arange(len(A))[A < 0] t = A[A<=5] a4 = t[-5<=t] import numpy as np Ex().check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") vars = ['a1', 'a2', 'a3', 'a4'] must_be_array = [False, True, True, True] for i in range(len(vars)): v = vars[i] obj = Ex().check_object(v, missing_msg = "ไม่มีตัวแปร `" + v + "`") if must_be_array[i]: obj.has_equal_value(expr_code = "type("+v+")", incorrect_msg = "`" + v + "` ต้องเป็น numpy array") obj.has_equal_value(expr_code = v+".dtype", incorrect_msg = "`" + v + "` เก็บข้อมูลที่มีประเภทข้อมูลไม่ตรงตามโจทย์") ex = Ex().set_env(A = np.random.randint(-10, 10, np.random.randint(10,100))) ex.has_equal_value(name = v, incorrect_msg = "`" + v + "` มีค่าไม่ตรงตามโจทย์")
แบบฝึกหัด 11-3 ข้อที่ 5

จงเขียนฟังก์ชัน clip_to(x, e) ที่รับ x เป็นอาเรย์มิติเดียว และ e เป็นจำนวน ฟังก์ชันนี้จะเปลี่ยนค่าใน x ที่เกิน e ให้เท่ากับ e ฟังก์ชันนี้ไม่คืนอะไร (ไม่ต้องใช้คำสั่งวงวน)

import numpy as np def clip_to(x,e): import numpy as np def clip_to(x,e): x[x>e] = e import numpy as np q = "`" fname = "clip_to" arg1 = 'np.array([1,1,2,3,4,5,4,5,1,2,1,3,3,4,5,4,6])' arg2 = '3' func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์สองตัว') func.check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") fcall = fname + "(" + arg1 + "," + arg2 + ")" func.check_call(fcall).has_equal_value(incorrect_msg= "ฟังก์ชันนี้ต้องไม่คืนอะไรเลย") func.check_body().set_context(eval(arg1), eval(arg2)).has_equal_value(name = "x", incorrect_msg = "ยังทำงานไม่ถูกต้อง")
แบบฝึกหัด 11-3 ข้อที่ 6

จงเขียนฟังก์ชัน to_second(hms) รับ hms เป็นอาเรย์ขนาด nx3 แต่ละแถวมี 3 ช่องเก็บจำนวนชั่วโมง นาที และวินาที ฟังก์ชันนี้คืนอาเรย์ n ช่องของจำนวนเต็ม โดยช่องที่ k จะเก็บจำนวนวินาทีรวมที่คำนวณได้จากจำนวนชั่วโมง นาที และวินาทีของแถวที่ k ของ hms (ไม่ต้องใช้คำสั่งวงวนใด ๆ ในฟังก์ชัน)

import numpy as np def to_second(hms): import numpy as np def to_second(hms): return hms[:,0]*3600 + hms[:,1]*60 + hms[:,2] import numpy as np q = "`" fname = "to_second" arg = 'np.array(' + \ str([[np.random.randint(0, 20), np.random.randint(0, 59), np.random.randint(0, 59)] for k in range(10)]) + ')' func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์หนึ่งตัว') func.check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") fcall = fname + "(" + arg + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")
แบบฝึกหัด 11-3 ข้อที่ 7

จงเขียนฟังก์ชัน to_hms(second) รับ second เป็นอาเรย์ขนาด n ช่อง แต่ละช่องเก็บจำนวนวินาที ฟังก์ชันนี้คืนอาเรย์ nx3 ช่องของจำนวนเต็ม แต่ละแถวมี 3 ช่อง เก็บจำนวนชั่วโมง นาที และวินาทีตามลำดับ โดยนำ second ช่องที่ k ไปแปลงเป็นชั่วโมง นาที วินาที แล้วเก็บในแถวที่ k ของผลลัพธ์ เช่น 3661 วินาที แปลงได้เป็น 1 ชั่วโมง 1 นาที และ 1 วินาที (ไม่ต้องใช้คำสั่งวงวนใด ๆ ในฟังก์ชัน)

import numpy as np def to_hms(second): import numpy as np def to_hms(second): return np.array([ second//3600, second%3600//60, second%60]).T import numpy as np q = "`" fname = "to_hms" arg = 'np.array(' + str([np.random.randint(3000, 30000) for k in range(10)]) + ')' func = Ex().check_function_def(fname, missing_msg="ไม่พบฟังก์ชัน " + (q+fname+q)) func.has_equal_part_len('args', 'ฟังก์ชันนี้รับพารามิเตอร์หนึ่งตัว') func.check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") fcall = fname + "(" + arg + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")