Python 如何删除数据数组中的两个最低值?
我从阵列开始:Python 如何删除数据数组中的两个最低值?,python,numpy,Python,Numpy,我从阵列开始: np.random.seed(959) superArray = np.random.randint(101, size=(5,3)) 删除2个最小值后,我需要计算超级阵列的中值 我似乎找不到任何方法来删除使用Ndarray的值。下面的代码就是我所想的 np.median(superArray.delete(superArray,[min(superArray),min(superArray)])) 当然,这对我来说是个错误,因为delete不是ndarray类型的方法,但这
np.random.seed(959)
superArray = np.random.randint(101, size=(5,3))
删除2个最小值后,我需要计算超级阵列的中值
我似乎找不到任何方法来删除使用Ndarray的值。下面的代码就是我所想的
np.median(superArray.delete(superArray,[min(superArray),min(superArray)]))
当然,这对我来说是个错误,因为delete
不是ndarray类型的方法,但这正是我想要的。您不必删除或删除任何内容。您可以只处理不包含不需要的元素的数组视图。最简单的方法是切片。所以你可以把它们按顺序排列,比如跳过前两个
np.median(np.sort(superArray.ravel())[2:])
您需要使用ravel()
来展平阵列。您不必删除或删除任何内容。您可以只处理不包含不需要的元素的数组视图。最简单的方法是切片。所以你可以把它们按顺序排列,比如跳过前两个
np.median(np.sort(superArray.ravel())[2:])
您需要ravel()
来展平数组。您可以np.partition
和ravel
<代码>np。在大型数组中,分区将比整体排序快
np.random.seed(959)
superArray=np.random.randint(101,大小=(5,3))
np.partition(superArray.ravel(),2)[2:]
您可以np.partition
和ravel
<代码>np。在大型数组中,分区将比整体排序快
np.random.seed(959)
superArray=np.random.randint(101,大小=(5,3))
np.partition(superArray.ravel(),2)[2:]
您可以使用np.quantile
而不是更改超级数组np.中位数(x)
与np.分位数(x,1/2)
相同。如果不考虑两个最小的元素,则将中点上移1,即可以使用np.分位数(superArray,1/2+1/(superArray.size-1)
np.quantile
和np.median
都有点慢,使用np.partition
可以获得更好的性能:
# do-it-yourself quantile
idx = np.arange((superArray.size+1)//2,(superArray.size+2)//2+1)
np.partition(superArray,idx,axis=None)[idx].mean() == ref
#True
时间:
def f():
idx = np.arange((superArray.size+1)//2,(superArray.size+2)//2+1)
return np.partition(superArray,idx,axis=None)[idx].mean()
def g():
return np.quantile(superArray,1/2+1/(superArray.size-1))
def h():
return np.median(np.partition(superArray.ravel(),2)[2:])
def i():
return np.median(np.sort(superArray.ravel())[2:])
for tag,fn in [('partition',f),('quantile',g),('median+part',h),('median+sort',i)]:
print(f'{tag:20s} {timeit(fn,number=100000)*10:.4f} us')
# partition 14.5955 us
# quantile 96.5980 us
# median+part 30.1133 us
# median+sort 29.4419 us
对于更大的(1000x1000)超级阵列相同:
partition 12.2952 ms
quantile 12.7227 ms
median+part 20.8914 ms
median+sort 87.3877 ms
你可以使用np.分位数np.中位数(x)
与np.分位数(x,1/2)
相同,而不是改变superArray
。如果你不考虑两个最小的元素,你就把中点向上移动了1,也就是说,你可以使用np.分位数(superArray,1/2+1/(superArray.size-1)
np.quantile
和np.median
都有点慢,使用np.partition
可以获得更好的性能:
# do-it-yourself quantile
idx = np.arange((superArray.size+1)//2,(superArray.size+2)//2+1)
np.partition(superArray,idx,axis=None)[idx].mean() == ref
#True
时间:
def f():
idx = np.arange((superArray.size+1)//2,(superArray.size+2)//2+1)
return np.partition(superArray,idx,axis=None)[idx].mean()
def g():
return np.quantile(superArray,1/2+1/(superArray.size-1))
def h():
return np.median(np.partition(superArray.ravel(),2)[2:])
def i():
return np.median(np.sort(superArray.ravel())[2:])
for tag,fn in [('partition',f),('quantile',g),('median+part',h),('median+sort',i)]:
print(f'{tag:20s} {timeit(fn,number=100000)*10:.4f} us')
# partition 14.5955 us
# quantile 96.5980 us
# median+part 30.1133 us
# median+sort 29.4419 us
对于更大的(1000x1000)超级阵列相同:
partition 12.2952 ms
quantile 12.7227 ms
median+part 20.8914 ms
median+sort 87.3877 ms
请使用2d数组定义remove
,删除2个值是不可能的。请给出一个具体的例子,例如,即使与np.arange(15)一样简单。重塑(5,3)
请使用2d数组定义remove
,删除2个值是不可能的。请给出一个具体的例子,例如,即使与np.arange(15)一样简单。重塑(5,3)
Smart。我从来没有用过那个函数。我想你只需要对那个结果应用median
,你就完成了。Smart。我从来没有用过那个函数。我想你只需要对那个结果应用median
,你就完成了。我希望这个被接受,我从来没有想过这个!我希望这个被接受,我从来没有想过我早就想到了!