Используйте лямбда-выражение с массивом numpy - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь заполнить свой массив с учебными ярлыками. Скажите k = 0 и size = 3, k = 1 и size = 3, результат должен выглядеть следующим образом: np.array ([0], [0], [0], [1], [1], [1] )

Теперь этот код работает:

np.array([0]*size1, [1]*size2, ...)

Но это не работает:

train_labels = np.array([k]*size for k, size in enumerate(train_sizes))

Когда я звоню keras.utils.to_categorical вроде:

train_labels = keras.utils.to_categorical(train_labels, num_classes = class_size)

Это даст мне следующую ошибку:

TypeError: long() argument must be a string or a number, not 'generator'

Может кто-нибудь помочь мне с этим? Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

([k]*size for k, size in enumerate(train_sizes)) - это выражение генератора, что означает, что оно вычисляется для итератора, а не последовательности. np.array хочет последовательности; если вы даете ему итератор, он обрабатывает его как последовательность одного объекта, самого итератора, что не очень полезно. (Это то, на что жалуется keras - он ожидает массив чисел, а вы дали ему массив объектов итераторов.)

Но np.array будет принимать списки, и вы можете легко превратить выражение генератора в понимание списка, используя скобки вместо слов (или в дополнение к символам, где дополнительные символы необязательны):

np.array([[k]*size for k, size in enumerate(train_sizes)])

Или, если вы не хотите тратить время и память на создание этого списка, вы можете использовать np.fromiter, но это немного сложно использовать для двумерных массивов, и ваша последовательность достаточно мала что я не буду беспокоиться о преобразовании его в список здесь.

0 голосов
/ 04 мая 2018

Используйте список понимания :

>>> train_labels = np.array([[k]*size for k, size in enumerate(train_sizes)])

вместо генератора .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...