一个的有趣的numpy应用,如果算法有问题请大家指教。
#-*-coding:UTF-8-*-
'''
某地有两个村庄王庄和李庄,王庄的人在星期一、三、五说谎,李庄的人在星期二、四、六说谎。在其他日子他们说实话。
一天,外地来的游客来到这里,见到两个人,分别向他们提出关于日期的问题,两个人都回答说,“前天是我说谎的日子。”
已知被问的两个人分别来自王庄和李庄,请问游客来的的那天星期几?
'''
import numpy as np
if __name__ == "__main__":
# ------ 初始值 ------
# 0 代表撒谎的事实,1代表实话的事实
# 王村
wang = np.array([0, 1, 0, 1, 0, 1, 1])
# 李村
li = np.array([1, 0, 1, 0, 1, 0, 1])
# 事实情况
fact = np.zeros(7)
# 目标天顺序
seq = [5, 6, 0, 1, 2, 3, 4]
# ------ 运算区域 ------
# 计算王村的事实
wang_fact = np.logical_not(np.logical_xor(wang, fact))
# 计算李村的事实
li_fact = np.logical_not(np.logical_xor(li, fact))
# 计算王村的目标天的事实
wang_obj_fact = wang[seq]
# 计算李村的目标天的事实
li_obj_fact = li[seq]
# 对比事实找到星期几
weekday = np.array(['一', '二', '三', '四', '五', '六', '日'])
for i in np.arange(len(wang_fact)):
if(wang_fact[i] == wang_obj_fact[i] and li_fact[i] == li_obj_fact[i]):
print("游客来的的那天是星期%s" % weekday[i])
应用到的技巧:
1. np.zeros(7):创建全0数组;
2. np.logical_xor():逻辑异或操作;
3. np.arange():创建自然数组;
4. 花式索引:wang[seq] 与 li[seq]