Я пытаюсь удалить подмассивы из многомерного массива numpy, используя условие. В этом примере я хочу удалить все подмассивы, содержащие значение 999. Вот одна из моих неудачных попыток:
a = np.array([[[1,2,3], [1,2,3]],
[[999,5,6], [4,5,6]],
[[999,8,9], [7,999,9]]
])
for i in range(0,len(a)):
if 999 in a[i]:
np.delete(a, i, 0)
Результат, который я хочу:
array([[1,2,3], [1,2,3]])
Это всего лишь небольшой пример, который должен помочь мне понять большую проблему, которая выглядит так:
# win_list_hyper.shape -> (1449168, 233)
# win_list_multi.shape -> (1449168, 12, 5, 5)
win_list_hyper = np.where(win_list_hyper <= 0, -3.40282e+38, win_list_hyper)
win_list_multi = np.where(win_list_multi <= 0, -3.40282e+38, win_list_multi)
# fail!:
for i in range(0,len(win_list_multi)):
if -3.40282e+38 in win_list_multi[i] or -3.40282e+38 in win_list_hyper[i]:
np.delete(win_list_multi, i, 0)
np.delete(win_list_hyper, i, 0)
(кстати, если вы знаете, как сделать это более эффективным, пожалуйста, дайте мне знать!)
Ваша первая попытка не удалась, так как np.delete
не работает на месте (т. е. не изменяет массив, а возвращает новый). Кроме того, удаление элементов из массива во время его повторения обычно не является хорошей идеей (если вы не знаете, что делаете).
Вы можете просто использовать np.where
следующим образом:
inds = np.where(a == 999) # get indices where value equals 999
np.delete(a, inds[0], axis=0) # delete along first dimension
Результат:
array([[[1, 2, 3],
[1, 2, 3]]])
Решение Jussi Nurminen отлично работает для моего примера, но я должен был понять, что мой пример не очень хорош. Я не мог так легко перевести данное решение на свои данные. Тем не менее, решение Jussi Nurminen мне очень помогло, потому что оно дало мне Идею замаскировать мои массивы. Я надеюсь, что мое решение не испортит мои данные (например, перетасует их). Для тех, кому интересно...
... Это мое решение для моего (плохого) примера:
a = np.array([[[1,2,3], [1,2,3]],[[999,5,6], [4,5,6]],[[999,8,9], [7,999,9]]])
a_mask = []
for i in range(0,len(a)):
if 999 in a[i]:
x = 0
else: x = 1
a_mask.append(x)
a_mask = np.asarray(a_mask)
inds = np.where(a_mask == 0)
b = np.delete(a, inds, axis=0)
... А вот как это выглядит в переводе на мои данные:
# win_list_multi.shape -> (1449168, 12, 5, 5)
# win_list_hyper.shape -> (1449168, 233
win_list_multi = np.where(win_list_multi <= 0, -1, win_list_multi)
win_list_hyper = np.where(win_list_hyper <= 0, -1, win_list_hyper)
win_list_multi_mask = []
for i in range(0,len(win_list_multi)):
if -1 in win_list_multi[i]:
x = 0
else: x = 1
win_list_multi_mask.append(x)
win_list_multi_mask = np.asarray(win_list_multi_mask)
win_list_hyper_mask = []
for i in range(0,len(win_list_hyper)):
if -1 in win_list_hyper[i]:
x = 0
else: x = 1
win_list_hyper_mask.append(x)
win_list_hyper_mask = np.asarray(win_list_hyper_mask)
inds = np.where((win_list_multi_mask == 0) | (win_list_hyper_mask == 0))
win_list_multi_nd = np.delete(win_list_multi, inds, axis=0)
win_list_hyper_nd = np.delete(win_list_hyper, inds, axis=0)
# win_list_multi_nd.shape -> (9679, 12, 5, 5)
# win_list_hyper_nd.shape -> (9679, 233)
Спасибо за помощь. Я должен был понять, что мой пример не был хорошим. Я не мог так легко перевести ваше решение на мои данные. Тем не менее, вы мне очень помогли. Ваше решение дало мне идею замаскировать мои массивы. Я надеюсь, что мое решение не испортит мои данные (например, перетасует их).