Условное сопоставление массива Numpy

Мне нужно сопоставить два очень больших массива Numpy (один - 20000 строк, другой - около 100000 строк), и я пытаюсь создать сценарий, чтобы сделать это эффективно. Простой цикл по массивам невероятно медленный, может ли кто-нибудь предложить лучший способ? Вот что я пытаюсь сделать: массив dateSecondDict и массив pwfs2Dates содержат значения datetime, мне нужно взять каждое значение datetime из массива pwfs2Dates (меньший массив) и посмотрите, есть ли такое значение datetime (плюс минус 5 минут) в массиве dateSecondDict (их может быть больше 1). Если есть один (или несколько), я заполняю новый массив (того же размера, что и массив pwfs2Dates ) значением (одним из значений) из массива valsSecondDict (что просто массив с соответствующими числовыми значениями dateSecondDict ). Вот решение @unutbu и @joaquin, которое сработало для меня (спасибо, ребята!):

import time
import datetime as dt
import numpy as np

def combineArs(dict1, dict2):
   """Combine data from 2 dictionaries into a list.
   dict1 contains primary data (e.g. seeing parameter).
   The function compares each timestamp in dict1 to dict2
   to see if there is a matching timestamp record(s)
   in dict2 (plus/minus 5 minutes).
   ==If yes: a list called data gets appended with the
   corresponding parameter value from dict2.
   (Note that if there are more than 1 record matching,
   the first occuring value gets appended to the list).
   ==If no: a list called data gets appended with 0."""
   # Specify the keys to use    
   pwfs2Key = 'pwfs2:dc:seeing'
   dimmKey = 'ws:seeFwhm'

   # Create an iterator for primary dict 
   datesPrimDictIter = iter(dict1[pwfs2Key]['datetimes'])

   # Take the first timestamp value in primary dict
   nextDatePrimDict = next(datesPrimDictIter)

   # Split the second dictionary into lists
   datesSecondDict = dict2[dimmKey]['datetime']
   valsSecondDict  = dict2[dimmKey]['values']

   # Define time window
   fiveMins = dt.timedelta(minutes = 5)
   data = []
   #st = time.time()
   for i, nextDateSecondDict in enumerate(datesSecondDict):
       try:
           while nextDatePrimDict < nextDateSecondDict - fiveMins:
               # If there is no match: append zero and move on
               data.append(0)
               nextDatePrimDict = next(datesPrimDictIter)
           while nextDatePrimDict < nextDateSecondDict + fiveMins:
               # If there is a match: append the value of second dict
               data.append(valsSecondDict[i])
               nextDatePrimDict = next(datesPrimDictIter)
       except StopIteration:
           break
   data = np.array(data)   
   #st = time.time() - st    
   return data

Спасибо, Айна.

5
задан Aina 21 December 2011 в 13:54
поделиться