ให้ A
เป็นอาเรย์สองมิติเก็บจำนวนเต็มขนาด 10x8 ที่มีให้แล้ว จงเขียนคำสั่งให้ค่ากับตัวแปรต่อไปนี้ (ไม่ต้องใช้คำสั่งวงวน)
s1
เก็บผลรวมของทุกจำนวนใน As2
เก็บอาเรย์ขนาด 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 + "` มีค่าไม่ตรงตามโจทย์")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")
จงเขียนฟังก์ชัน 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) + " ให้ผลผิด")