Вы можете использовать функцию numpy.eye.
import numpy as np
def one_hot_encode(x, n_classes):
"""
One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
: x: List of sample Labels
: return: Numpy array of one-hot encoded labels
"""
return np.eye(n_classes)[x]
def main():
list = [0,1,2,3,4,3,2,1,0]
n_classes = 5
one_hot_list = one_hot_encode(list, n_classes)
print(one_hot_list)
if __name__ == "__main__":
main()
Результат
D:\Desktop>python test.py
[[ 1. 0. 0. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 0. 0. 1. 0.]
[ 0. 0. 0. 0. 1.]
[ 0. 0. 0. 1. 0.]
[ 0. 0. 1. 0. 0.]
[ 0. 1. 0. 0. 0.]
[ 1. 0. 0. 0. 0.]]
Это правильная реализация OpenMP и игнорирует изменения в среде изнутри программы. Как указано в стандарте OpenMP 3.1, стр. 159:
Изменения в переменных среды после запуска программы, даже если они были изменены самой программой, игнорируются реализацией OpenMP.
blockquote>Вы выполняете именно то, что сказано в этом параграфе.
OpenMP позволяет изменять такие параметры только через функции
omp_set_*
, но нет такой функции для потока -limit-var ICV:Однако настройки некоторых ICV могут быть изменены во время выполнения программы OpenMP с помощью соответствующих директивных предложений или подпрограмм OpenMP API.
blockquote>Я думаю, вы можете использовать
num_threads
предложение#pragma omp parallel
для достижения желаемого.
Изменение поведения OpenMP с использованием OMP_THREAD_LIMIT
(или любой другой переменной среды OMP_*
) невозможно после запуска программы; они предназначены для использования пользователем. Вы можете заставить пользователя вызывать вашу программу через скрипт, который устанавливает OMP_THREAD_LIMIT
, а затем вызывает вашу программу, но это, вероятно, не то, что вам нужно сделать в этом случае.
OMP_NUM_THREADS
, omp_set_num_threads
, и предложение num_threads
обычно используются для установки количества потоков, работающих в регионе.
OMP_THREAD_LIMIT
, вероятно, будет лучшим решением на практике. Если вы возьмете десять равных кусков работы, а затем разделите два из них пополам, это вряд ли улучшит производительность, потому что наихудшие потоки все еще так же медленны. Если ваш алгоритм эффективно выполняет какую-то балансировку нагрузки, тогда вы можете также использовать вызовы omp_set_num_threads, чтобы явно определить, какие потоки будут разделены во вложенной области.
– Sean Patrick Santos
11 September 2013 в 01:58
Это может быть оффтопным, но вы можете попробовать openmp collapse вместо ручной работы здесь.