Как выполнить выборку массива в Python без цикла for
Есть ли "питонный" способ чистого сэмплирования без нескольких циклов for?
Этот пример ниже - тип цикла for, от которого я хочу избавиться.
Минимальный рабочий пример:
import numpy as np
unsampled_array = [1,3,5,7,9,11,13,15,17,19]
number_of_samples = 7
downsampled_array = []
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
for index in downsampling_indices:
downsampled_array.append(unsampled_array[int(index)])
print(downsampled_array)
Результат:
>>> [ 1 5 7 9 13 17 19]
2 ответа
Решение
Вам нужна функция np.ix_
, следующее:
import numpy as np
unsampled_array = np.array([1,3,5,7,9,11,13,15,17,19])
number_of_samples = 5
downsampling_indices = np.linspace(0, len(unsampled_array)-1, number_of_samples).round()
downsampling_indices = np.array(downsampling_indices, dtype=np.int64)
indices = np.ix_(downsampling_indices)
downsampled_array = unsampled_array[indices]
print(downsampled_array)
Если вы хотите "реальную" понижающую дискретизацию, где каждое значение является средним значением k, вы можете использовать
unsampled_array.reshape(-1, k).mean(1)
Убедитесь, что unsampled_array является массивом np.array. В вашем случае k=2. Это даст вам:
[2. 6. 10. 14. 18.]
* Обновление: если вы просто хотите взять первый элемент для каждого k элементов, вы можете использовать этот код:
unsampled_array.reshape(-1, 2)[:, 0]
Посмотрите на этот сюжет: