Вставка элементов в ndarray с использованием уникального заполнения для каждого элемента - PullRequest
1 голос
/ 27 апреля 2019

Я довольно новичок в python и прочитал много ТАК вопросов по этой теме, однако ни один из них не отвечает моим потребностям.

Я получаю ndarray:

[[1, 2, 3]
 [4, 5, 6]]

СейчасЯ хочу дополнить каждый элемент (например, [1, 2, 3]) специальным отступом только для этого элемента.Конечно, я мог бы сделать это в цикле for и добавить каждый результат к новому ndarray, но нет ли более быстрого и чистого способа, которым я мог бы применить это ко всему ndarray одновременно?

Я думал, что это может сработатькак:

myArray = [[1, 2, 3]
           [4, 5, 6]]

paddings = [(1, 2),
            (2, 1)]

myArray = np.pad(myArray, paddings, 'constant')

Но, конечно, это просто выводит:

[[0 0 0 0 0 0 0 0 0]
 [0 0 1 2 3 0 0 0 0]
 [0 0 3 4 5 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0]]

Это не то, что мне нужно.Целевой результат будет:

[[0 1 2 3 0 0]
 [0 0 4 5 6 0]]

Как мне этого добиться, используя numpy?

1 Ответ

1 голос
/ 27 апреля 2019

Вот решение на основе цикла, но с созданием массива нулей согласно размерам входного массива и отступов.Объяснение в комментариях:

In [192]: myArray
Out[192]: 
array([[1, 2, 3],
       [4, 5, 6]])

In [193]: paddings
Out[193]: 
array([[1, 2],
       [2, 1]])

# calculate desired shape; needed for initializing `padded_arr`
In [194]: target_shape = (myArray.shape[0], myArray.shape[1] + paddings.shape[1] + 1)

In [195]: padded_arr = np.zeros(target_shape, dtype=np.int32)

In [196]: padded_arr
Out[196]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]], dtype=int32)

После этого мы можем использовать цикл for для заполнения слотов последовательностей из myArray, основываясь на значениях из paddings:

In [199]: for idx in range(paddings.shape[0]):
     ...:     padded_arr[idx, paddings[idx, 0]:-paddings[idx, 1]] = myArray[idx]
     ...:     

In [200]: padded_arr
Out[200]: 
array([[0, 1, 2, 3, 0, 0],
       [0, 0, 4, 5, 6, 0]], dtype=int32)

Причина, по которой мы прибегаем к решению на основе цикла, заключается в том, что numpy.lib.pad() еще не поддерживает такого рода заполнение, даже со всеми доступными дополнительными режимами и аргументами ключевых слов, которые уже есть.обеспечивает.

...