11: NumPy

11-2: Array Index and Slice

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

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

อินพุตเป็นข้อมูลบรรยายเมทริกซ์ บรรทัดแรกมีจำนวนเต็มสองจำนวน คือ จำนวนแถว (r) กับจำนวนคอลัมน์ (c) ของเมทริกซ์ ตามด้วยอีก r บรรทัด แต่ละบรรทัดประกอบด้วยจำนวนเต็ม c จำนวน (ทุก ๆ จำนวนคั่นด้วยช่องว่าง) จงเขียนคำสั่งอ่านข้อมูลจากอินพุตมาสร้างอาเรย์สองมิติชื่อ A

import numpy as np A = np.array(np.random.randint(0, 9, (8,10)), str) ___inp___ = ['8 10'] + [' '.join(A[i]) for i in range(len(A))] def input(): t = ___inp___.pop(0) ___inp___.append(t) return t import numpy as np import numpy as np r,c = [int(e) for e in input().split()] A = np.ndarray((r,c),int) for i in range(A.shape[0]): A[i] = np.array([int(e) for e in input().split()]) vars = ['A'] 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-2 ข้อที่ 2

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

  • a0 เก็บข้อมูลตัวมุมขวาล่างสุดของ A
  • a1 เก็บข้อมูลทุกคอลัมน์ของแถวคู่ ของ A
  • a2 เก็บข้อมูลเฉพาะคอลัมน์คี่ของทุกแถว ของ A
  • a3 เก็บข้อมูลเฉพาะคอลัมน์คู่ของแถวบนสุดของ A
  • a4 เก็บข้อมูลแถวคี่เฉพาะคอลัมน์ที่อินเด็กซ์ 1 ของ A
  • a5 เก็บข้อมูลทุกตัวในจตุภาค (quadrant) ที่ 2 ของ A (เมื่อแบ่ง A เป็นสี่จตุภาคเท่า ๆ กัน)
  • a6 เก็บข้อมูลทุกตัวในจตุภาค (quadrant) ที่ 4 ของ A (เมื่อแบ่ง A เป็นสี่จตุภาคเท่า ๆ กัน)
  • a7 เก็บข้อมูลทุกคอลัมน์ในแถวเฉพาะแถวบนสุดกับแถวล่างสุด ของ A
  • a8 เก็บข้อมูลทุกแถวในคอลัมน์เฉพาะคอลัมน์ขวาสุดและซ้ายสุด ของ A
  • a9 เก็บข้อมูลทุกแถวของ A ยกเว้นแถวอินเด็กซ์ 4

import numpy as np A = np.random.randint(0,9,(8,10)) import numpy as np import numpy as np r,c = A.shape a0 = A[-1, -1] a1 = A[::2] a2 = A[:, 1::2] a3 = A[0, ::2] a4 = A[1::2, 1] a5 = A[:r//2, :c//2] a6 = A[r//2:, c//2:] a7 = A[[0,r-1]] a8 = A[:,[-1,0]] a9 = A[list(range(0,4))+list(range(5,r))] Ex().check_not(has_code(r"(for|while)"), msg="ไม่ใช้ for หรือ while นะ") vars = ['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9'] 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 + "` เก็บข้อมูลที่มีประเภทข้อมูลไม่ตรงตามโจทย์") msg = "" if v == 'a8': msg = " โจทย์ให้นำคอลัมน์ขวาสุดมาก่อน แล้วค่อยตามด้วยคอลัมน์ซ้ายสุด" obj.has_equal_value(incorrect_msg = "`" + v + "` มีค่าไม่ตรงตามโจทย์" + msg)
แบบฝึกหัด 11-2 ข้อที่ 3

จงเขียนฟังก์ชัน submatrix(M, i, j) ที่รับเมทริกซ์ M และ จำนวนเต็ม i กับ j ฟังก์ชันนี้คืนเมทริกซ์ย่อยใน M ที่ไม่รวมแถวที่ i ทั้งแถว และไม่รวมคอลัมน์ที่ j ทั้งคอลัมน์ของ M (ไม่ต้องใช้คำสั่งวงวน) เช่น submatrix(np.array([[1,2,3,4],[5,6,7,8],[4,3,2,1],[8,7,6,5]]), 1, 2) จะได้ np.array([[1,2,4], [4,3,1], [8,7,5]])

import numpy as np def submatrix(M, i, j): import numpy as np def submatrix(M, i, j): R = list(range(M.shape[0])) C = list(range(M.shape[1])) return M[R[:i]+R[i+1:]][:, C[:j]+C[j+1:]] import numpy as np q = "`" fname = "submatrix" 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 นะ") arg1 = 'np.array(' + str(np.random.randint(0,9,(10,10)).tolist()) + ')' for i,j in [(0,0), (9,9), (0,9), (9,0), (1,8), (8,1)]: fcall = fname + "(" + arg1 + "," + str(i) + ',' + str(j) + ")" func.check_call(fcall).has_equal_value(incorrect_msg=(q+fname+q) + " ให้ผลผิด")
เลือกทุกแถวแบบไม่รวมแถวที่ i ให้ได้เป็นเมทริกซ์ก่อน แล้วค่อยทำอีกครั้งโดยเลือกทุกคอลัมน์แต่ข้ามคอลัมน์ j