11: NumPy

11-6: Basic Numpy Stat. Function

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

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

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

  • s1 เก็บผลรวมของทุกจำนวนใน A
  • s2 เก็บอาเรย์ขนาด 8 ช่อง แต่ละช่องเก็บผลรวมของแต่ละคอลัมน์ใน A
  • m3 เก็บอาเรย์ขนาด 10 ช่อง แต่ละช่องเก็บค่ามากสุดของแต่ละแถวใน A
  • m4 เก็บอาเรย์ขนาด 8 ช่อง แต่ละช่องเก็บอินเด็กซ์ของแถวที่มีค่ามากสุดของแต่ละคอลัมน์ใน A
  • a5 เก็บอาเรย์ขนาด 10 ช่อง แต่ละช่องเก็บค่าเฉลี่ยของจำนวนในแต่ละแถวของ A

import numpy as np A = np.random.randint(-10, 10, (10,8)) import numpy as np import numpy as np s1 = np.sum(A) s2 = np.sum(A, axis=0) m3 = np.max(A, axis=1) m4 = np.argmax(A, axis=0) a5 = np.mean(A, axis=1) import numpy as np Ex().check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") for v in ["s1", "s2", "m3", "m4", "a5"]: obj = Ex().check_object(v, missing_msg = "ไม่มีตัวแปร `" + v + "`") if v != "s1": 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-6 ข้อที่ 2

จงเขียนฟังก์ชัน eq_array(A, B) ที่รับอาเรย์ A และ B เพื่อตรวจสอบว่า ทั้งสองอาเรย์นี้เหมือนกันหรือไม่ "เหมือนกัน" ในที่นี้คือมีขนาดและข้อมูลข้างในเหมือนกันหมดเลย (ไม่ต้องใช้คำสั่งวงวน) หมายเหตุ: จะใช้แค่คำสั่ง A==B คงไม่ได้นะ เพราะอะไร ?

import numpy as np def eq_array(A, B): import numpy as np def eq_array(A, B): return A.shape == B.shape and \ np.sum(A!=B) == 0 import numpy as np q = "`" fname = "eq_array" a1 = 'np.array([[[1,5,3],[1,2,4],[2,4,2]], [[1,1,3],[2,2,4],[2,3,4]]])' a2 = 'np.array([[[1,5,3],[1,2,4],[2,4,2]], [[1,1,3],[2,2,4],[2,3,4]]])' a3 = 'np.array([[[1,5,3],[1,2,4],[2,4,2]], [[1,5,3],[1,2,4],[2,4,2]]])' a4 = 'np.array([[[1,5,3],[1,2,4],[2,4,2]]])' 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|equal)"), msg="ใช้เฉพาะคำสั่งของ numpy เท่าที่เรียนมานะ") for v1,v2 in [[a1,a2], [a1,a3], [a3,a4]]: fcall = fname + "(" + v1 + "," + v2 + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")
แบบฝึกหัด 11-6 ข้อที่ 3

จงเขียนฟังก์ชัน z_scores(x) ที่รับ x เป็นอาเรย์มิติเดียวเก็บคะแนน เพื่อคืนอาเรย์หนึ่งมิติที่เก็บค่าคะแนนมาตรฐาน หรือที่เรียกว่า z-score โดยที่ zi = (xi - μ)/σ, μ และ σ คือ ค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานของข้อมูลใน x (ไม่ต้องใช้คำสั่งวงวน)

import numpy as np def z_scores(x): import numpy as np def z_scores(x): return (x - np.mean(x))/np.std(x) import numpy as np q = "`" fname = "z_scores" arg1 = 'np.array(' + str(np.random.randint(0,100,30).tolist()) + ', float)' 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 + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")
แบบฝึกหัด 11-6 ข้อที่ 4

จงเขียนฟังก์ชัน nearest(x, e) ที่รับ x เป็นอาเรย์มิติเดียว และ e เป็นจำนวน ฟังก์ชันนี้คืนค่าใน x ที่มีค่าใกล้กับ e ที่สุด เช่น nearest(np.array([10, 30, 3, 4, 9]), 28) จะได้ 30 (ไม่ต้องใช้คำสั่งวงวน)

import numpy as np def nearest(x,e): import numpy as np def nearest(x,e): return x[np.argmin(np.abs(x-e))] import numpy as np q = "`" fname = "nearest" arg1 = 'np.array(' + str(np.random.randint(0,100,30).tolist()) + ', float)' arg2 = str(np.random.randint(0,100)) 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=(q+fname+q) + " ให้ผลผิด")
แบบฝึกหัด 11-6 ข้อที่ 5

จงเขียนฟังก์ชัน common_items(x1, x2) ที่รับ x1 กับ x2 ที่เป็นอาเรย์มิติเดียว (ภายในแต่ละอาเรย์ไม่มีตัวซ้ำกัน) ฟังก์ชันนี้คืนอาเรย์ที่เก็บค่าที่มีอยู่ทั้งใน x1 และ x2 (ตามลำดับก่อนหลังที่ปรากฏใน x1) เช่น common_items(np.array([1,2,3,4]), np.array([0,4,2])) จะได้ np.array([2,4]) (ไม่ต้องใช้คำสั่งวงวน, set หรือ dict)

import numpy as np def common_items(x1,x2): import numpy as np def common_items(x1,x2): x2_T = x2.reshape((len(x2),1)) c = np.sum(x1==x2_T, axis=0) return x1[c > 0] import numpy as np q = "`" fname = "common_items" arg1 = 'np.array(' + str(list(set(np.random.randint(0,12,15)))) + ')' arg2 = 'np.array(' + str(list(set(np.random.randint(3,15,15)))) + ')' 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|set|dict|intersect1d)"), msg="อยากให้ฝึกใช้คำสั้งของ numpy เท่าที่เรียนมานะ") fcall = fname + "(" + arg1 + "," + arg2 + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")