In [423]: adf = pd.DataFrame(a)
In [424]: ix_list = np.arange(nrow,dtype=np.int32)
您的问题索引创建A F有序排列,如flags
和strides
看到。这是我期望在普通numpy阵列上做transpose
时看到的结果。
In [426]: adf.loc[ix_list].values.flags
Out[426]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [427]: adf.loc[ix_list].values.strides
Out[427]: (4, 40)
但其他loc
索引产生一个C顺序排列:
In [428]: adf.loc[:].values.flags
Out[428]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
....
In [429]: adf.loc[ix_list[::2]].values.flags
Out[429]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...
In [430]: adf.loc[ix_list[:-2]].values.flags
Out[430]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
...
这看起来在pandas
loc
索引的错误。
我猜np.ascontiguousarray
是最便宜的方法来确保所有的情况下都是C排序的,因为它有一个np.array(..., copy=False)
,这是一个条件copy
。已经是C
的数组将不会复制。
在快速测试中,增加一个copy
或np.ascontiguousarray
并不会减慢速度。
In [439]: timeit np.ascontiguousarray(adf.loc[ix_list].values).flags
514 µs ± 7.07 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [440]: timeit adf.loc[ix_list].values.copy().flags
509 µs ± 5.94 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [441]: timeit adf.loc[ix_list].values.flags
513 µs ± 18.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [442]: timeit adf.loc[:].values.flags
24.9 µs ± 11.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [443]: timeit np.ascontiguousarray(adf.loc[:].values).flags
30 µs ± 865 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [444]: timeit adf.loc[ix_list[:-1]].values.flags
559 µs ± 12.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [445]: timeit np.ascontiguousarray(adf.loc[ix_list[:-1]].values).flags
559 µs ± 1.41 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
的numpy的阵列上选择行是大大高于使用loc
:
In [446]: timeit adf.loc[:].values[ix_list].flags
32.9 µs ± 1.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [447]: timeit adf.values[ix_list].flags
20.9 µs ± 1.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
这是什么'loc'产生阵列的'shape'?它的“旗帜”? – hpaulj
你的意思是从a.loc [ix_list ,:]中ndarray的形状?它与a的形状相同,在这种情况下是(10,10)。 –