最「numpythonic」的方式是使用broadcasting。這是計算距離矩陣的一種快速而簡單的方法,然後您可以獲取絕對值的argmin
。
形狀的
array1 = np.random.rand(4004001)
array2 = np.random.rand(1000)
# Calculate distance matrix (on truncated array1 for memory reasons)
dmat = array1[:400400] - array2[:,None]
# Take the abs of the distance matrix and work out the argmin along the last axis
ix = np.abs(dmat).argmin(axis=1)
dmat
:
(1000, 400400)
的形狀ix
和內容:
(1000,)
array([237473, 166831, 72369, 11663, 22998, 85179, 231702, 322752, ...])
然而,它的內存餓了,如果你在一個去做這個手術了,居然不在我的8GB機器上處理您指定的陣列大小,這就是爲什麼我減小了array1
的大小的原因。
要使其在內存限制內工作,只需將其中一個數組切片爲塊,然後依次(或平行)在每個塊上應用廣播。在這種情況下,我將array2
分爲10個區塊:
# Define number of chunks and calculate chunk size
n_chunks = 10
chunk_len = array2.size // n_chunks
# Preallocate output array
out = np.zeros(1000)
for i in range(n_chunks):
s = slice(i*chunk_len, (i+1)*chunk_len)
out[s] = np.abs(array1 - array2[s, None]).argmin(axis=1)
首先對兩個數組進行排序。然後遍歷大數組,保持小數組中當前最接近的元素的索引。根據需要增加索引。如果itertools中有些東西會加快速度,我不會感到驚訝。 –
[在numpy數組中找到最接近的值]的可能重複(http://stackoverflow.com/questions/2566412/find-nearest-value-in-numpy-array) –