Hi @Keith72, this is how pytorch conv1d actually do in your case:
x = torch.rand(1, 16, 8820)
weight = torch.rand(16, 16, 3)

# first pad zeros along the time dimension
x = torch.pad(x, [1, 1])    #shape = (1, 16, 8822)

#unfolded, so you have 8820 moving windows with size = (16, 3)
x = x.unfold(2, 3, 1)    #shape = (1, 16, 8820, 3)

# matrix multiplication, I use tensordot for simplicity
y = torch.tensordot(x,weight, dims=([1, 3], [1, 2]))     #shape = (1, 16, 8820)

In numpy you can simply replace pad and tensordot with corresponding numpy function; for unfold you can use numpy.lib.stride_tricks.as_strided.