Numpy Zero Padding, чтобы соответствовать определенной форме - PullRequest
1 голос
/ 29 мая 2019

У меня есть файл с массивами или различными формами.Я хочу обнулить весь массив, чтобы он соответствовал самой большой форме.Самая большая форма (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

Ответы [ 3 ]

3 голосов
/ 29 мая 2019

Вот подход, использующий 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)
2 голосов
/ 29 мая 2019

Если вы хотите заполнить вправо и вниз вашего исходного массива в 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.

1 голос
/ 29 мая 2019

Вы могли бы сделать это так. 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...