Python 基于应用于另一个数组的布尔表达式选择一个数组的值
从以下数组开始Python 基于应用于另一个数组的布尔表达式选择一个数组的值,python,arrays,numpy,Python,Arrays,Numpy,从以下数组开始 array([ nan, nan, nan, 1., nan, nan, 0., nan, nan]) 它是这样生成的: import numpy as np row = np.array([ np.nan, np.nan, np.nan, 1., np.nan, np.nan, 0., np.nan, np.nan]) 我想获得排序数组的索引,然后排除nan。在这种情况下,我想得到[6,3] 我想出了以下方法: vals = np.s
array([ nan, nan, nan, 1., nan, nan, 0., nan, nan])
它是这样生成的:
import numpy as np
row = np.array([ np.nan, np.nan, np.nan, 1., np.nan, np.nan, 0., np.nan, np.nan])
我想获得排序数组的索引,然后排除nan
。在这种情况下,我想得到[6,3]
我想出了以下方法:
vals = np.sort(row)
inds = np.argsort(row)
def select_index_by_value(indices, values):
selected_indices = []
for i in range(len(indices)):
if not np.isnan(values[i]):
selected_indices.append(indices[i])
return selected_indices
selected_inds = select_index_by_value(inds, vals)
现在所选的
inds
是[6,3]
。然而,这似乎需要相当多的代码来实现一些简单的东西。有没有一种更简单的方法 你可以这样做-
# Store non-NaN indices
idx = np.where(~np.isnan(row))[0]
# Select non-NaN elements, perform argsort and use those argsort
# indices to re-order non-NaN indices as final output
out = idx[row[idx].argsort()]
你可以这样做-
# Store non-NaN indices
idx = np.where(~np.isnan(row))[0]
# Select non-NaN elements, perform argsort and use those argsort
# indices to re-order non-NaN indices as final output
out = idx[row[idx].argsort()]
另一种选择:
row.argsort()[~np.isnan(np.sort(row))]
# array([6, 3])
另一种选择:
row.argsort()[~np.isnan(np.sort(row))]
# array([6, 3])
还有另一种更快的解决方案(针对OP数据) Psidom解
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
迪瓦卡溶液
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
基于Divakar的解
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
我认为这是可行的,因为
np.where(~np.isnan(row))
保留了顺序 还有另一个更快的解决方案(针对OP数据)
Psidom解
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
迪瓦卡溶液
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
基于Divakar的解
%timeit row.argsort()[~np.isnan(np.sort(row))]
The slowest run took 31.23 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 8.16 µs per loop
%timeit idx = np.where(~np.isnan(row))[0]; idx[row[idx].argsort()]
The slowest run took 35.11 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.73 µs per loop
%timeit np.where(~np.isnan(row))[0][::-1]
The slowest run took 9.42 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 2.86 µs per loop
我认为这是可行的,因为
np.where(~np.isnan(row))
保留了顺序 这两种解决方案都有效,但我发现布尔索引的使用比Numpy的where
更优雅。谢谢这两种解决方案都有效,但我发现布尔索引的使用比Numpy的where
更优雅。谢谢