В дополнение к ответу @Markus: если ваш daList
очень большой и числовой, следующее будет намного быстрее (например, 30x), хотя и несколько менее общим:
Sqrt@Total[daList^2,{3}]
Вот пример:
In[17]:= largeDaList = N@RandomInteger[30,{100000,4,2}];
In[18]:= Map[EuclideanDistance[#,{0,0}]&,largeDaList,{2}]//Short//Timing
Out[18]= {0.953,{{31.7648,34.6699,20.3961,31.305},<<99998>>,{<<18>>,<<2>>,0.}}}
In[19]:= Sqrt@Total[largeDaList^2,{3}]//Short//Timing
Out[19]= {0.031,{{31.7648,34.6699,20.3961,31.305},<<99998>>,{<<18>>,<<2>>,0.}}}
Причина в том, что такие функции, как Power
и Sqrt
равны Listable
, и вы вводите итерацию в ядро. Такие функции, как Map
, также могут автоматически компилировать сопоставленную функцию во многих случаях, но, очевидно, не в этом случае.
EDIT
запрос Per OP, вот это обобщение на случай нетривиальной точки отсчета:
refPoint = {3, 5};
Sqrt@Total[#^2, {3}] &@Transpose[Transpose[daList, {3, 2, 1}] - refPoint, {3, 2, 1}]
Это все еще быстро, но не так кратко, как раньше. Для сравнения, вот код, основанный на Map
- ping, который требует только тривиальной модификации:
Map[EuclideanDistance[#, refPoint] &, daList, {2}]
Разница в производительности остается того же порядка, хотя векторизованное решение немного замедляется из-за необходимости нетривиальных транспозиций.