我有一个表示一些时间序列数据的数组:
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”。
答案 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
函数。