Python:将标签分配给数组中的值

时间:2019-02-20 13:16:14

标签: python pandas numpy time-series

我有一个表示一些时间序列数据的数组:

array([[[-0.59776013],
    [-0.59776013],
    [-0.59776013],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [ 0.31863936],
    [ 0.31863936],
    [ 0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [ 0.59776013],
    [ 0.59776013],
    [ 0.59776013],
    [ 0.93458929],
    [ 0.93458929],
    [ 0.93458929],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.06270678],
    [-0.06270678],
    [-0.06270678],
    [-0.06270678],
    [-0.06270678],
    [-0.06270678],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [ 0.75541503],
    [ 0.75541503],
    [ 0.75541503],
    [ 0.93458929],
    [ 0.93458929],
    [ 0.93458929],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [ 0.75541503],
    [ 0.75541503],
    [ 0.75541503],
    [-0.31863936],
    [-0.31863936],
    [-0.31863936],
    [ 0.31863936],
    [ 0.31863936],
    [ 0.31863936],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ],
    [ 0.        ]]])

此数组中的唯一值是:

np.unique(sax_dataset_inv)
array([-0.59776013, -0.31863936, -0.06270678,  0.        ,  0.31863936,
    0.59776013,  0.75541503,  0.93458929])

我的任务

将“ F”代表快速,“ S”代表慢,或“ M”代表中等到给定的数组值。

我的尝试

我可以为2个作业(“ F”或“ S”)执行此操作:

sax_list = ['F' if element < 0 else 'S' for element in list(sax_dataset_inv.flatten())]

但是我不明白如何对3个不同的标签执行相同的表达式。

所需的输出

以[-3-2-1,0,1,2,3,4,5,6]的数组为例

值-3至-1(含)应分配为'F'。 值0到3(含3)应分配为“ M”。 大于3的值应分配为“ S”。

4 个答案:

答案 0 :(得分:2)

您可以这样做:

arr = np.array([-3-2-1,0,1,2,3,4,5,6])
new_arr = np.zeros(shape = arr.shape, dtype=np.str)

new_arr[(arr>3)] = 'S'
new_arr[((arr>=-3) & (arr<=-1))] = 'F'
new_arr[((arr>=0)&(arr<=3))] = 'M'
new_arr
array(['', 'M', 'M', 'M', 'M', 'S', 'S', 'S'], dtype='<U1')

与您的条件不匹配的值将保留为空字符串。

您还可以使用numpy.empty初始化一个空数组:

new_arr = np.empty(shape = arr.shape, dtype=np.str)

答案 1 :(得分:2)

numpy.select用于矢量化解决方案:

 function uploadApi() {
    $image = $_FILES;
    foreach ($image as $key => $img) {
        if (!is_dir('./Uploads/')) {
            mkdir('./Uploads/', 0777, TRUE);
        }
        if (!empty($img['name'])) {
            $config['upload_path'] = './Uploads/Products/';
            $config['allowed_types'] = '*';
            $config['max_size'] = '100';
            $config['max_width'] = '1024';
            $config['max_height'] = '768';
            $config['overwrite'] = TRUE;
            $config['file_name'] = date('U') . '_' . $img['name'];
            $this->load->library('upload', $config);
            $this->upload->initialize($config);
            if (!$this->upload->do_upload($key)) {
                $error = array('error' => $this->upload->display_errors());
                print_r($error);
                die;
            } else {
                if ($this->upload->do_upload($key)) {
                    $image_data = $this->upload->data();
                    $update["userfile"] = $config['file_name'];
                    $res = $this->m->update_post($update);
                }
            }
        }
    }
    $this->load->view('imgtest');
}

性能

new_arr = np.select([arr>3, (arr>=-3) & (arr<=-1), (arr>=0)&(arr<=3)],
                    ['S','F','M'], 
                    default='')
print (new_arr)

['F' 'F' 'F' 'M' 'M' 'M' 'M' 'S' 'S' 'S']

答案 2 :(得分:1)

注意:OP的间隔为[-3,-1], [0,3] & (3,..),因此我仅假设整数值。可以相应地更改条件,但设计仍然保留。

list comprehensions用于if-elif-else

my_list = [-3,-2,-1,0,1,2,3,4,5,6]

my_list_mapping = ['F' if ((i >= -3) & (i <= -1)) else 'M' if ((i >= 0) & (i <= 3)) else 'S' for i in my_list]
print(my_list_mapping)
    ['F', 'F', 'F', 'M', 'M', 'M', 'M', 'S', 'S', 'S']

答案 3 :(得分:1)

您可以使用Python核心库中的map函数来巧妙地实现您的结果 假设您的映射函数看起来像这样:

    def mapping_function(value):
        if value >= -3 and value <= -1:
            return 'F'
        elif value >= 0 and value <= 3:
            return 'M'
        elif value > 3:
            return 'S'
        else:
            return 'U'  # eg. as undefined
    my_array = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6]
    mapped_vals = map(mapping_function, my_array)
    # if you want a list
    my_mapped_list = list(mapped_vals)

我认为这是一种可读且清晰的解决方案。

由于您已将其标记为熊猫问题,因此请从他们的文档中查看pandas.Series.apply函数。 不用将其用作地图,而是将映射函数作为参数传递给apply函数。