İki çok büyük Numpy dizisini eşleştirmem gerekiyor (biri 20000 satır, başka bir 100000 satır) ve bunu verimli bir şekilde yapmak için bir komut dosyası oluşturmaya çalışıyorum. Diziler üzerinde basit döngü inanılmaz derecede yavaş, birisi daha iyi bir yol önerebilir mi? İşte yapmaya çalıştığım şey: dizi datesSecondDict
ve dizi pwfs2Dates
datetime değerlerini içerir, her bir datetime değerini dizi pwfs2Dates
'dan (daha küçük bir dizi) almam ve dizide bir datetime değeri var mı (artı eksi 5 dakika) olup olmadığını görmem gerekir datesSecondDict
(1'den fazla olabilir). Bir (veya daha fazla) varsa, valsSecondDict
dizisinden gelen değerle (değerlerden biri) (pwfs2Dates
dizilişiyle aynı boyutta) yeni bir dizi dolduruyorum (bu yalnızca datesSecondDict
'a karşılık gelen sayısal değerlere sahip dizidir). İşte benim için çalıştı @unutbu ve @joaquin bir çözümdür (teşekkürler çocuklar!):Numpy dizisi koşullu eşleştirmesi
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
sayesinde Aina.
sayesinde verir o kadar, tamamen işe yaradı! Aslında çalışmak için – Aina