LINUX.ORG.RU

numpy обработка большого массива


0

1

имеется numpy массив F0(N,4), где N~1e5-1e7, требуется построить новый массив, F1(M,4), строки которого — есть результат вычисления некоторой функции от аргументов соответствующих строк массива F1, причём, если аргументы функции не удовлетворяют некоторому условию, то эта строка пропускается, т.е. M<=N. python больше всего тормозит на циклах. поэтому вопрос — можно ли как то организовать эти вычисления без цикла?

★★★★★
Ответ на: комментарий от alikhantara

несмотря на то что каждое вычисление не зависит от соседних?

F0([a0,b0,c0,d0],..,[a,b,c,d],..,[aN,bN,cN,dN]) --> F1(func([a0,b0,c0,d0]),..,func([a,b,c,d]),..,func([aN,bN,cN,dN])

thunar ★★★★★
() автор топика
Ответ на: комментарий от alikhantara

а как работают встроенные в numpy функции? тот же

fe0=ones((1e7,4),float)+1
fe1= exp(fe0)+sqrt(fe0)
отрабатывает достаточно быстро

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Они просто реализованы на C. Если не найдёшь подходящую встроенную функцию, обрати внимание на Cython, там даже в документации что-то насчёт numpy было.

Divius ★★
()

строки которого — есть результат вычисления некоторой функции от аргументов соответствующих строк массива F1, причём, если аргументы функции не удовлетворяют некоторому условию, то эта строка пропускается

(mapcar (λ (l) ...) (remove-if-not #'predicatep F0))

Правда внутри это всё равно развернётся в цикл. И это не совсем питон.

ugoday ★★★★★
()
Ответ на: комментарий от Divius

ясно. интересно, а в каких языках можно так сделать? к тому же для такой задачи так и просится распараллеливание

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

в каких языках можно так сделать?

Как «так»? Я вот предлагаю нужную часть на Cython реализовать.

к тому же для такой задачи так и просится распараллеливание

PyCUDA?;)

Divius ★★
()

Так тебе без цикла или распараллелить? Если первое, то в Питоне есть filter, map и list comprehensions.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Очевидно, что человеку нужна сила Луны, а не жалкие списковые генераторы. Особенно, если след. Элемент зависит от предыдущих. Тут астрал не иначе.

anonymous
()
Ответ на: комментарий от anonymous

А. Не зависит. Извините. Тогда мультипроцессинг, каждому по части массива и вперед.

anonymous
()

Либо цикл либо map (генератор). Генератор тут как бы просится, но во первых не оч понятно как оно будет numpy протаскиваться, во вторых была статья Гвидо что не всегда оно хорошо. В общем сделайте неск вариантов и выберите самый быстрый.

А вообще если важна скорость такие вещи делают на С/фортране, питон все же для другого

AIv ★★★★★
()

Я к сожалению не силен в numpy, но в matlab можно вроде так, а если учитывать, что numpy был сделан с оглядкой на matlab, то в нем тоже должно быть можно.

1. сначала фильтр:

t0_1 = t0[:,nonzero(v>0.5)[0]]

2. затем само вычисление

t1 = f(t0_1)

синтакс я уверен не правильный, но идею я надеюсь можно понять.

anonymous
()
Ответ на: комментарий от AIv

да теперь и буду реализовывать на фортране и его из питона дёргать. просто на питоне каркас накидать проще.

thunar ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Я к сожалению не силен в numpy, но в matlab можно вроде так

- Расскажите про слонов.

- Слоны большие и питаются деревьями. А на деревьях живут мухи. Мухи...

iVS ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.