問題:
- 我有M個在不同幀上采樣的物體,我想計算每一幀上成對的距離。
- 我有M個物件在不同的幀上采樣,我想計算每一幀上成對的距離。我將距離存盤為一個多維陣列
xij,有三個軸,其中元素xij[t,i,j]對應于物體i和j在時間t的距離。例如,我們可以有N = 10**5。 M = 10 xij = np.random.uniform(0, 10, N).reshape(int(N/M**2), M, M) - 現在我想計算配對之間的平均距離不包括相同物件之間的配對(也就是說,不包括元素
xij[t,i,i])。我實作的方法是首先將這些指數的值改為NaN,然后使用np.nanmean()。xij[...,np.arange(M), np.arange(M)] = np.nan Mean = np.nanmean(xij, axis = -1) - 然而,將所有這些值改為
np.nan成為我程式的一個瓶頸,在我看來,也許沒有必要。是否有更快的替代方案?我看到在np.mean中有一個引數where,以選擇包括在計算中的元素作為一個boolen陣列。我想知道你是否可以比使用我實作的Nan技巧更有效地創建這個陣列。或者,也許可以使用掩碼陣列?雖然我對它們并不熟悉。
uj5u.com熱心網友回復:
你可以先求和,然后減去對角線,再除以M-1:
meanDistance = (np.sum(xij, axis = -1) - np. diagonal(xij, axis1=-2, axis2=-1) / (M - 1)
演示結果:
(sum-diag) / (M-1) 。
時間in秒。0.03786587715148926
t=0 前三個平均值: [5.42617836 5.03198446 5.67675881]
nanmean:
時間in秒。0.18410110473632812
t=0前三條含義:[5.42617836 5.03198446 5.67675881]
演示代碼(在線試用! ):
import numpy as np
from time import time
N = 10**7
M = 10 10
xij = np.random.uniform(0, 10, N).reshape(int(N/M**2), M, M)
print('(sum-diag) / (M-1):'/span>)
t0 = time()
meanDistance = (np.sum(xij, axis = -1) - np.diagonal(xij, axis1=-2, axis2=-1) / (M - 1)
print(' time in seconds:'/span>, time() - t0)
print(' t=0 前三條均值:', meanDistance[0,:3] )
print()
print('nanmean:'/span>)
t0 = time()
xij[...,np.arange(M), np.arange(M)] = np.nan
meanDistance = np.nanmean(xij, axis = -1)
print(' time in seconds:'/span>, time() - t0)
print(' t=0 前三條均值:', meanDistance[0,:3] )
uj5u.com熱心網友回復:
編輯:我錯誤地認為需要先計算一個距離。
這似乎是與numpy.triu_indices一起進行的重塑練習。如果距離 x[i,j] != x[j,i] 你需要與 triu_indices & tril_indices相結合。
我假設x[i,j] = x[j,i],比:
import numpy as np
N =10000
xij = np.random.uniform(0, 10, (N,N)
np.mean( xij[ np.tril_indices(N, k=1) ] )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326825.html
標籤:
下一篇:SQL獲取每個成員的最新可用性
