Я хочу разбить массив numpy на три разных массива на основе логического сравнения. Массив numpy, который я хочу разбить, называется x
. Это форма выглядит следующим образом, но это элементы различны: (В ответ на комментарий Saullo Кастро я включил несколько иной массив х.)Эффективно выберите подраздел numpy array
array([[ 0.46006547, 0.5580928 , 0.70164242, 0.84519205, 1.4 ],
[ 0.00912908, 0.00912908, 0.05 , 0.05 , 0.05 ]])
Эти значения этого массива монотонно возрастает вдоль столбцов. У меня также есть два других массива: lowest_gridpoints
и highest_gridpoints
. Записи этих массивов также различаются, но форма всегда совпадает со следующим:
array([ 0.633, 0.01 ]), array([ 1.325, 0.99 ])
Процедура выбора Я хочу подать заявление выглядит следующим образом:
- Все столбцы, содержащие значения ниже, чем любое значение в
lowest_gridpoints
следует удалить изx
и составить массивtemp1
. - Все столбцы, содержащие значения, превышающие любое значение в
highest_gridpoints
, должны быть удалены сx
и составляют массивtemp2
. - Все столбцы
x
, которые не включены ни вtemp1
, ниtemp2
составляют массивx_new
.
Следующий код, который я написал, выполняет задачу.
if np.any(x[:,-1] > highest_gridpoints) or np.any(x[:,0] < lowest_gridpoints):
for idx, sample, in enumerate(x.T):
if np.any(sample > highest_gridpoints):
max_idx = idx
break
elif np.any(sample < lowest_gridpoints):
min_idx = idx
temp1, temp2 = np.array([[],[]]), np.array([[],[]])
if 'min_idx' in locals():
temp1 = x[:,0:min_idx+1]
if 'max_idx' in locals():
temp2 = x[:,max_idx:]
if 'min_idx' in locals() or 'max_idx' in locals():
if 'min_idx' not in locals():
min_idx = -1
if 'max_idx' not in locals():
max_idx = x.shape[1]
x_new = x[:,min_idx+1:max_idx]
Однако, я подозреваю, что этот код очень неэффективен из-за интенсивного использования петель. Кроме того, я думаю, что синтаксис раздувается.
Есть ли у кого-то идеи для кода, который более эффективно выполняет задачу, описанную выше, или выглядит лаконично?
ваш пример возвращает '[]' для меня ... было бы неплохо иметь другой вход, который может быть использован для сравнения ... –
@SaulloCastro: Спасибо вы за свой комментарий. Я слегка изменил массив x. У вас есть идея о том, как изменить код? – fabian
Вы ожидаете, что temp1 и temp2 будут взаимоисключающими, или может случиться, что столбец имеет как значение, меньшее, чем значение в «lower_gridpoints», и другое значение, превышающее значение в «high_gridpoints»? Кроме того, вы имели в виду монотонное увеличение по рядам? – greschd