我有一个数组或不同形状的文件。我想对所有数组进行零填充以匹配最大的形状。最大的形状是(93,13)。
要对此进行测试,我有以下代码:
testarray = np.ones((41,13))
我如何对此数组进行零填充以匹配(93,13)的形状?最终,我如何才能完成数千行?
编辑:在评论中找到了解决方案:
for index, array in enumerate(mfcc):
testarray = np.zeros((93,13))
for index,row in enumerate(array):
for i in range(0,len(row)-1):
testarray[index][i]= row[i]
mfcc[index] = testarray
答案 0 :(得分:3)
这是一种使用np.pad
的方法,可以推广到任意目标形状:
def to_shape(a, shape):
y_, x_ = shape
y, x = a.shape
y_pad = (y_-y)
x_pad = (x_-x)
return np.pad(a,((y_pad//2, y_pad//2 + y_pad%2),
(x_pad//2, x_pad//2 + x_pad%2)),
mode = 'constant')
对于建议的示例:
a = np.ones((41,13))
shape = [93, 13]
to_shape(a, shape).shape
# (93, 13)
让我们再举一个例子:
shape = [100, 121]
to_shape(a, shape).shape
# (100, 121)
时间
def florian(array, shape):
#print(array)
testarray = np.zeros(shape)
for index,row in enumerate(array):
for i in range(0,len(row)-1):
testarray[index][i]= row[i]
def to_shape(a, shape):
y_, x_ = shape
y, x = a.shape
y_pad = (y_-y)
x_pad = (x_-x)
return np.pad(a,((y_pad//2, y_pad//2 + y_pad%2),
(x_pad//2, x_pad//2 + x_pad%2)),
mode = 'constant')
a = np.ones((500, 500))
shape = [1000, 1103]
%timeit florian(a, shape)
# 101 ms ± 5.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit to_shape(a, shape)
# 19.8 ms ± 318 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
答案 1 :(得分:2)
如果要在2D模式下向原始阵列的右侧和底部进行填充,请按以下步骤操作:
import numpy as np
a = np.ones((41,11))
desired_rows = 91
desired_cols = 13
b = np.pad(a, ((0, desired_rows-a.shape[0]), (0, desired_cols-a.shape[1])), 'constant', constant_values=0)
print(b)
"""
prints
[[1. 1. 1. ... 1. 0. 0.]
[1. 1. 1. ... 1. 0. 0.]
[1. 1. 1. ... 1. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
"""
当然,它不是防错的解决方案,例如如果所需的行数或列数小于原始数组的相应大小,则会得到ValueError: index can't contain negative values
。
答案 2 :(得分:1)
您可以这样做。 array
是您的原始数组,在这种情况下仅用于测试用例。只需使用自己的一个即可。
import numpy as np
array = [[None] * 10]*10
#print(array)
testarray = np.zeros((93,13))
for index,row in enumerate(array):
for i in range(0,len(row)-1):
testarray[index][i]= row[i]