Невозможно вставить три последовательных нуля в массив Numpy - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь вставить 3 последовательных нуля в каждой альтернативной позиции в данном массиве.Это прекрасно работает со списком, но не с массивом, так как когда я запускаю цикл for, он не сохраняет его внутри массива, а просто печатает его на время

var = [1,2,3,4,5]
n = 0
for j in range(4):
    for i in range(3):
        n = n+1
        var.insert(n,0)
    n=n+1
print(var)

zero_3 = np.zeros(3)
var2 = np.array([1,2,3,4,5])
for n in range(1,5):
    print(var2)
    print(np.insert(var2,n,zero3))
    print(var2)
    n=n+3


#Output when I run it shows this:
#var
#[1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5]
#var2 for all lines below
#[1 2 3 4 5]
#[1 0 0 0 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 0 0 0 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 0 0 0 4 5]
#[1 2 3 4 5]
#[1 2 3 4 5]
#[1 2 3 4 0 0 0 5]
#[1 2 3 4 5]

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

то, что вы хотите сделать, на самом деле называется padding , и есть готовая к использованию функция, например np.pad.

var = np.arange(5) + 1 # -> array([1, 2, 3, 4, 5])
var = var.reshape(5 ,1) # -> array([[1],[2],[3],[4],[5]])
var = np.pad(var, ((0,0), (0,3)), mode='constant',constant_values=0)
var = var.reshape(-1) # to flattern the tensor, make it a rank-1 array, after executing this line, var should be like array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0])
# if you don't want the last 3 zeros, do:
var = var[:-3]

basicиспользование np.pad равно

np.pad(var, ((left1, right1), (left2,right2)),mode='constant',constant_values=0)

, где var - тензор ранга 2 с формой [A, B], а возвращаемый тензор имеет форму [A + left1 + right1, B + left2 + right2].

, значение left1, right1, left2, right2, A, B можно объяснить этой картинкой:

intuitive explanation of padding

Легко обобщить формулу для тензора ранга n.Но для простоты я пишу в качестве примера только тензор ранга 2.

см. numpy.pad для более изощренного использования.

0 голосов
/ 26 мая 2018
In [87]: var2 = np.array([1,2,3,4,5])

In [88]: np.insert(var2,[1,2,3,4],[0])
Out[88]: array([1, 0, 2, 0, 3, 0, 4, 0, 5])

In [94]: np.insert(var2,[1,1,1,2,2,2,3,3,3,4,4,4],0)
Out[94]: array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5])

In [96]: np.insert(var2,np.repeat(np.arange(1,5),3),0)
Out[96]: array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5])

Под одеялом insert просто делает:

In [97]: res = np.zeros((var2.shape[0]+3*(var2.shape[0]-1)), dtype=var2.dtype)
In [98]: res[::4]=var2
In [99]: res
Out[99]: array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...