Numpy Swap / Заменить запись NoneType с Numpy Array (т.е. вектором) - PullRequest
0 голосов
/ 04 июня 2018

Дан пустой массив, содержащий два типа элементов:

  1. записей "numpy.ndarray" и
  2. записей "NoneType"

Как сделатьЯ заменяю все записи "NoneType", например, np.zeros (some_shape)?Может ли это быть также сделано для любого типа отдельных элементов, таких как скаляр, например, вместо NoneType?

Пример:

test_array=
    array([[array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ..., None, None,
    None],
   [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ..., None, None,
    None],
   [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None, None],
   ..., 
   [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None],
   [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None],
   [array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), ...,
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
    array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)]], dtype=object)

, где массив в test_array может выглядеть так:

test_array[323]=
   array([array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8), None, None], dtype=object)

И я хочу заменить эти записи «None» нулевым вектором такой же длины, что и другие векторы (здесь позиции от 0 до 3).Чтобы мой результат для каждого массива (test_array [i] внутри test_array) выглядел так:

test_array[131]=
   array([array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8),
   array([[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)], dtype=object)

Поэтому я хотел бы заполнить все записи None массивами np.zeros. Существует функция numpy np.nan_to_num, но это не помогает мне, потому что мне нужно что-то вроде "np.nan_to_array".

Спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Обычно я бы не использовал цикл for с NumPy, но в вашем случае у вас есть массив объектов, который в любом случае не очень эффективен, и работа с комбинацией None и вложенных массивов, хранящихся как объекты, оченьсложно.Итак, сделайте это просто:

prototype = a[0]
for i, x in enumerate(a):
    if x is None:
        a[i] = np.zeros_like(prototype)

Конечно, вам нужно найти prototype, если a[0] - Нет.Это оставлено как упражнение.

...