numpy: Как выбрать строки из двух 2D-массивов на основе условий в 1D-массивах? - PullRequest
0 голосов
/ 05 января 2019

У меня есть два массива длины n, а именно old_fitness и new_fitness, и две матрицы размерности nxm, а именно old_values и new_values.

Каков наилучший способ создания nxm матрицы best_fitness, содержащей строку new_values[i], когда new_fitness[i] > old_fitness[i] и old_values[i] в противном случае?

Что-то вроде:

best_values = nd.where(new_fitness > old_fitness, new_values, old_values)

а что работает с строками последних двух матриц, а не с отдельными элементами? Я уверен, что есть простой ответ, но я полный новичок в NumPy.

Редактировать: new_values и old_values содержат строки, представляющие возможные решения проблемы, а new_fitness и old_fitness содержат числовую меру пригодности для каждого возможного решения / строки в new_values и old_values соответственно.

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Должно работать, пока сравнение имеет форму (n, 1), а не (n,)

импорт numpy как np

old_fitness = np.asarray([0,1])
new_fitness = np.asarray([1,0])

old_value = np.asarray([[1,2], [3,4]])
new_value = np.asarray([[5,6], [7,8]])

np.where((new_fitness>old_fitness).reshape(old_fitness.shape[0],1), new_value, old_value)

возвращает

array([[5, 6],
       [3, 4]])
0 голосов
/ 05 января 2019

Другое возможное решение, работающее с массивами NumPy:

best_values = numpy.copy(old_values)
best_values[new_fitness > old_fitness, :] = new_values[new_fitness > old_fitness, :]
0 голосов
/ 05 января 2019

Равны ли массивы? Если это так, то сожмите их, а затем используйте функцию карты, чтобы получить желаемый результат.

Например, что-то вроде:

bests = map(new_val if new_val > old_val else old_val for (old_val, new_val) in zip(old_fitness, new_fitness))

Редактировать: это, вероятно, лучше

bests = map(lambda n, o: n if n > o else o, new_fitness, old_fitness)

Вот еще один, который тоже работает!

bests = [np.max(pair) for pair in zip(new_fitness, old_fitness)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...