Not a duplicate of Zero pad numpy array (that I posted 9 years ago, ouch!) because here it's about n-dimensional arrays.
How to zero pad a numpy n-dimensional array, if possible in one line?
Example:
a = np.array([1, 2, 3])
zeropad(a, 8) # [1, 2, 3, 0, 0, 0, 0, 0]
b = np.array([[1, 2], [3, 4], [5, 6]])
zeropad(b, (5, 2)) # [[1, 2], [3, 4], [5, 6], [0, 0], [0, 0]]
When using b.resize((5, 2))
, here it works, but in some real cases, it gives:
ValueError: cannot resize this array: it does not own its data
How to zero pad numpy nd arrays no matter if it owns its data or not?
Instead of using pad
, since you want to pad after, you could create an array of zeros and assign the existing values:
out = np.zeros(pad, dtype=arr.dtype)
out[np.indices(arr.shape, sparse=True)] = arr
Or, if you only want to pad the first dimension, with resize
. Just ensure that the array owns its data with copy
:
out = arr.copy()
out.resize(pad)
Output:
array([[1, 2],
[3, 4],
[5, 6],
[0, 0],
[0, 0]])
resize
:IMO there is no good reason for that, but you could always use an assignment expression (python ≥ 3.8):
(out:=arr.copy()).resize(pad)
arr = np.array([[1, 2], [3, 4], [5, 6]])
pad = (5, 3)
# output zeros + assignment
array([[1, 2, 0],
[3, 4, 0],
[5, 6, 0],
[0, 0, 0],
[0, 0, 0]])
# output resize
array([[1, 2, 3],
[4, 5, 6],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])