numpy中choose用法

np.choose(a, choices, out=None, mode='raise'):按照序号a对choices中的数进行选择。

a: index array,其中的数必须是整数

mode=‘raise’,表示a中数必须在[0,n-1]范围内

mode=‘wrap’,a中数可以是任意的整数(signed),对n取余映射到[0,n-1]范围内

mode='clip',a中数可以是任意的整数(signed),负数映射为0,大于n-1的数映射为n-1


Example 1:

来自np.choose官方文档的例子,对list进行choose:

a = [[1, 0, 1], [0, 1, 0], [1, 0, 1]]
choices = [-10, 10]
np.choose(a, choices)
array([[ 10, -10,  10],
       [-10,  10, -10],
       [ 10, -10,  10]])
Example 2:
除了可以用于list,choose还可以用于np.array类型。
在机器学习中,通常a每行为一个sample,列数代表不同的feature。index中保存每个sample需要选出feature的序号。
那么可以通过以下操作在a中选出所有sample的目标feature:

a = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
index = np.array([0,2,1,0])
np.choose(index,a.T)
array([ 1,  6,  8, 10])



  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用ID3算法挑选西瓜的Python代码示例: ```python import pandas as pd import numpy as np import math # 计算数据集的熵 def calc_entropy(data): num_entries = len(data) label_counts = {} for feat_vec in data: current_label = feat_vec[-1] if current_label not in label_counts.keys(): label_counts[current_label] = 0 label_counts[current_label] += 1 entropy = 0.0 for key in label_counts: prob = float(label_counts[key]) / num_entries entropy -= prob * math.log(prob, 2) return entropy # 划分数据集 def split_data(data, axis, value): ret_data = [] for feat_vec in data: if feat_vec[axis] == value: reduced_feat_vec = feat_vec[:axis] reduced_feat_vec.extend(feat_vec[axis+1:]) ret_data.append(reduced_feat_vec) return ret_data # 选择最好的数据集划分方式 def choose_best_feature_to_split(data): num_features = len(data[0]) - 1 base_entropy = calc_entropy(data) best_info_gain = 0.0 best_feature = -1 for i in range(num_features): feat_list = [example[i] for example in data] unique_vals = set(feat_list) new_entropy = 0.0 for value in unique_vals: sub_data = split_data(data, i, value) prob = len(sub_data) / float(len(data)) new_entropy += prob * calc_entropy(sub_data) info_gain = base_entropy - new_entropy if (info_gain > best_info_gain): best_info_gain = info_gain best_feature = i return best_feature # 统计类别出现次数 def majority_cnt(class_list): class_count = {} for vote in class_list: if vote not in class_count.keys(): class_count[vote] = 0 class_count[vote] += 1 sorted_class_count = sorted(class_count.items(), key=lambda x: x[1], reverse=True) return sorted_class_count[0][0] # 创建决策树 def create_tree(data, labels): class_list = [example[-1] for example in data] if class_list.count(class_list[0]) == len(class_list): return class_list[0] if len(data[0]) == 1: return majority_cnt(class_list) best_feature = choose_best_feature_to_split(data) best_feature_label = labels[best_feature] my_tree = {best_feature_label: {}} del(labels[best_feature]) feat_values = [example[best_feature] for example in data] unique_vals = set(feat_values) for value in unique_vals: sub_labels = labels[:] my_tree[best_feature_label][value] = create_tree(split_data(data, best_feature, value), sub_labels) return my_tree # 定义西瓜数据 watermelon_data = pd.DataFrame({ '色泽': ['青绿', '乌黑', '乌黑', '青绿', '浅白', '青绿', '乌黑', '乌黑', '乌黑', '青绿', '浅白', '浅白', '青绿', '乌黑', '浅白', '青绿', '青绿', '青绿', '乌黑', '浅白'], '根蒂': ['蜷缩', '蜷缩', '稍蜷', '稍蜷', '硬挺', '稍蜷', '稍蜷', '稍蜷', '稍蜷', '平坦', '平坦', '蜷缩', '稍蜷', '稍蜷', '硬挺', '稍蜷', '稍蜷', '稍蜷', '蜷缩', '蜷缩'], '敲声': ['浊响', '沉闷', '浊响', '清脆', '清脆', '清脆', '浊响', '浊响', '沉闷', '清脆', '沉闷', '沉闷', '清脆', '浊响', '沉闷', '清脆', '浊响', '浊响', '浊响', '沉闷'], '纹理': ['清晰', '清晰', '清晰', '清晰', '清晰', '稍糊', '稍糊', '稍糊', '稍糊', '清晰', '稍糊', '稍糊', '清晰', '稍糊', '硬滑', '清晰', '稍糊', '稍糊', '清晰', '稍糊'], '脐部': ['凹陷', '凹陷', '凹陷', '凹陷', '平坦', '平坦', '平坦', '凹陷', '凹陷', '凹陷', '平坦', '蜷缩', '蜷缩', '凹陷', '平坦', '凹陷', '凹陷', '凹陷', '蜷缩', '平坦'], '触感': ['硬滑', '硬滑', '硬滑', '软粘', '软粘', '软粘', '硬滑', '硬滑', '硬滑', '软粘', '硬滑', '硬滑', '软粘', '硬滑', '软粘', '硬滑', '硬滑', '硬滑', '软粘', '硬滑'], '好瓜': ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否', '否', '否', '否'] }) # 训练集 train_data = watermelon_data.iloc[:13, :] train_labels = list(watermelon_data.columns)[:-1] # 构建决策树 my_tree = create_tree(train_data.values.tolist(), train_labels) print(my_tree) ``` 输出结果: ``` {'触感': {'软粘': '是', '硬滑': {'敲声': {'浊响': '否', '清脆': '是', '沉闷': '否'}}}} ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值