Есть ли способ, чтобы не делать копию, когда массив NumPy нарезанный?

Мне нужно обработать некоторые большие numpy массивами в моем проекте. После такой массив загружается с диска, более половины из памяти моего компьютера будет потребляться.

После выбора загружается, я делаю несколько кусочков (почти половина массива будут выбраны), то я получаю ошибку мне подсказывает, что памяти недостаточно.

Сделав небольшой эксперимент, я понимаю, я получаю ошибку, потому что, когда numpy массива ломтиками, копия будет создана

import numpy as np

tmp = np.linspace(1, 100, 100)
inds = list(range(100))
tmp_slice = tmp[inds]

assert id(tmp) == id(tmp_slice)

возвращает AssertionError

Есть ли способ, что часть в массива относится только к адресам памяти исходного массива, таким образом, данные не копируются?

0
2019-09-17 09:51:16
источник
5 ответов

Кулак вариант проще, потому что компилятор будет собирать, а затем выбрать из множества кандидатур, содержащий только один элемент add<int>(int, int)пециализация с. В то время как второй вариант будет вызывать компилятор выполнять некоторую дополнительную работу, собирая набор кандидатов, содержащий два элемента - и и выбирать между ними, используя необычные функции перегрузки алгоритм ранжирования.

+1
2019-09-17 10:27:52

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

template <>
long add<int>(int a, int b)
// ^- the return type is long , not int
{
    return a + b; //no reason to specialize, but still...
}

Компилятор будет жаловаться на Изменить возвращаемый тип, поскольку в декларации (и функция подписи) определяется основной шаблон. Компилятор даже не учитывать специализацию, когда делаешь разрешение перегрузки. Он просто создает экземпляр декларации от основного, и это объявление должно соответствовать то, что он заканчивает призывом.

Так что перегрузки являются более гибкими в том, как их можно определить. И нет двусмысленность для компилятора. Механизм разрешения перегрузки одолжений не шаблона созданный шаблон функции, если их типы аргументов совпадают. Чаще всего это легче перегрузить, чем специализировать шаблон функции.

+1
2019-09-17 10:27:52

Это делает никакой разницы в данном случае, но бывают случаи, когда это будет. Давайте посмотрим на этот пример кода

template<class T> // (a) 
void f(T);

template<>        // (b)
void f<>(int*);

template<class T> // (c)
void f(T*);

int main()
{
    int *p; 
    f(p);
}

Когда мы называем , какие функции вы бы ожидать, чтобы быть вызван? Большинство людей пошли бы на , и они будут неправы. Причина этого в том, что специализации не относятся к перегруженному разрешению. Они представляют собой особый рецепт для шаблона, который говорит компилятору, что если вас вывести этого типа, тогда печать из шаблона таким образом, вместо.

Так что компилятор делает, это идет через разрешение перегрузки и говорит, что я могу вызов с является , или я могу позвонить на с является в. Поскольку последняя является более специализированной ( меньше), c побед. Это может быть очень удивительно, но это делает много смысла, когда вы игнорируете специализации и перегрузок.

Уолтер Э. Браун имеет очень углубленно видео о шаблонах и специализация называется “С++ функции-шаблоны: как они действительно работают?” что вы должны рассмотреть наблюдение. Она длится час, но это очень подробно.

+1
2019-09-17 10:27:52

В "простых" случаях, они ведут себя одинаково, но они в некоторых случаях они отличаются.

Тривиальная разница, это явный вызов который будем называть специализации, а не от перегрузки.

Других различий происходит для разрешение перегрузки, как:

add(42, 4.2f);

завершится со специализацией шаблона ( и , так что не может быть выведено)

принимая во внимание, что перегрузка действует и преобразует элемент float в .

+1
2019-09-17 10:27:52

пока вы пытаетесь привязать переменную в свой маршрут она написана таким образом

так оно и будет

Route::post('like/{postId}/{userId}',[ 
  'uses' => '[email protected]', 
   'as' => 'user.like' ]);

вы можете проверить больше документов

+1
2019-09-17 17:37:31

Посмотрите другие вопросы по меткам