Как сделать функцию, которая делает большой массив из подмассивов одновременно эффективными и удобочитаемыми? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть функция, которая, по сути, генерирует несколько меньших числовых массивов и объединяет их в один большой.Примерно это выглядит примерно так:

def make_big_array(second, third):
   big_array = make_first()
   if second:
      big_array +=  make_second()
   if third:
      big_array += make_third()
   return big_array

По сути, у меня есть функция координатора, которая проверяет, должен ли big array включать некоторые вложенные массивы, создает их, а затем добавляет их к big_array, который он хочет вернуть.,Тем не менее, я предполагаю, что неэффективно сначала создавать каждый массив, а затем конкатенировать его до конца big_array.

Я полагаю, что альтернативой может быть использование second и third для тренировки продолжительности big_array в конечном итоге будет, а затем передаст make_second() и make_third() big_array и индекс для того, чтобы начать заполнять его, но это не кажется очень читабельным.Кто-нибудь получил какие-либо предложения о том, как сделать это быстро и читабельно?

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Как уже упоминалось в этой статье , рекомендуется предварительно выделить массив и сохранить в нем значения.Используя этот метод, программе не нужно изменять размер массива каждый раз, когда массив добавляется к исходному массиву.Вы можете сделать это для своего случая:

a = np.random.rand(1000000, 10)
second = np.random.rand(5000, 10)
third = np.random.rand(4000, 10)
if second:
    new = np.empty([len(a)+len(second), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = second
if third:
    new = np.empty([len(a)+len(third), a.shape[1]])
    new[:len(a)] = a
    new[len(a):] = third

Но пока вы просто объединяете два массива, эффективность, полученная этим способом, незначительна.

1 голос
/ 13 июня 2019

Вы можете создать все массивы отдельно, а затем объединить их за один раз:

def make_big_array(second, third):
    arrays = [make_first()]
    if second:
        arrays.append(make_second())
    if third:
        arrays.append(make_third())
    return np.concatenate(arrays)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...